AI智能
改变未来

python极简教程08:对象的方法

测试奇谭,BUG不见。

讲解之前,我先说说我的教程和网上其他教程的区别:

1 我分享的是我在工作中高频使用的场景,是精华内容;

2 我分享的是学习方法,亦或说,是指明你该学哪些、该重点掌握哪些内容;

3 基于1和2,你可以按照我的教程学,也可以网上找视频学,也可以看书学……你得明白,掌握学习方法比找学习资料重要得多。

这一场,主讲python的面向对象的第二部分——对象的方法

目的:掌握Python对象的五个核心方法。

init和new

讲解之前,先上一段代码

class Demo:def __init__(self, name):print("init")print("init " + name)def __new__(cls, *args, **kwargs):print("new")print("new " + args[0])d = Demo("张三")

通过前面的学习,你能说出这段代码运行的输出结果吗?

答案是:

#new#new 张三

通常,我们会认为__init__()是类的初始化方法,当实例化类之后,会优先执行它(运行后应当优先输出"init"、"init 张三"),但实际上,__new__()方法才优先执行的方法,同时,它也是创建对象的方法。

说得通俗一点:以造房子举例,new方法是打地基,存放建材原料,init方法则是按照图纸建造房子。

那么,什么时候用new方法?

其实,用得很少,更多的时候,我们使用的是init方法。但init方法用久了之后,就会误以为它是创建实例的方法,而实际上,new方法才是创建实例的方法。

大家谨记,以免面试时踩坑。

类方法、静态方法、对象方法

首先,先讲讲这三个方法如何使用。

  • 类方法:使用 @classmethod 装饰,第一个参数是cls
  • 静态方法:使用 @staticmethod 装饰
  • 对象方法:不使用装饰器,第一个参数是self
class Cat:age = 5area = \'Chengdu\'def __init__(self, name):self.name = name# 这是一个有问题的方法def drink():print("Cat drink")# 这是一个静态方法@staticmethoddef eat(food):print("Cat eat {}".format(food))# 这是一个对象方法def get_name(self):return self.name# 这是一个类方法@classmethoddef info(cls):print(cls.age)print(cls.area)print(self.name)# 实例化一只叫Kitty的黑猫black_cat = Cat(\'Kitty\')# 有问题的方法,直接报错了# black_cat.drink()# 静态方法调用black_cat.eat(\'fish\') # 可以实例(black_cat)调用Cat.eat(\'fish\') # 也可以类(Cat)调用# 类方法调用black_cat.info() # 可以实例(black_cat)调用Cat.info() # 也可以类(Cat)调用# 对象方法调用print(black_cat.get_name()) # 只能实例(black_cat)调用

到这里,你可能会问,这东西有啥用?

如果你只想写个脚本,执行一些简单的程序,那确实没啥用。你可以不关心这三个方法以及他们的调用,甚至连class类都不用写,直接def搞定。

但是,如果你想进阶,理解面向对象,它们很重要。

类方法

  • @classmethod 修饰,第一个参数是 cls
  • 方法作用:和实例无关,可以直接用
    类名.方法名()

    调用

  • 可能会需要用到类变量(注意:不是成员变量)
  • 可以类调用,也可以实例调用

静态方法

  • @staticmethod 修饰
  • 方法作用:和实例无关,可以直接用
    类名.方法名()

    调用,相当于一个类对外界提供的工具方法

  • 基本上不会用到类变量,用到类变量的话,只能硬编码调用类变量
  • 可以类调用,也可以实例调用

对象方法

  • 第一个参数是self
  • 实例的方法
  • 可以访问成员变量
  • 只能实例调用,不能类调用

一如既往,做个总结

01 我知道,对于初学者来说,面向对象,这个抽象的概念很难理解,但是,我没说,你一定要理解;

02 如果确实没有编码基础,先学会用,在用的过程中去理解,不更好吗?

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » python极简教程08:对象的方法