Discuss / Python / 大神解释下,Animal.run和Animal().run 有什么区别?

大神解释下,Animal.run和Animal().run 有什么区别?

Topic source

大神解释下,Animal.run和Animal().run 有什么区别?

我理解的Animal().run是对象的方法,但是Animal.run是什么意思?分别使用type查看类型,2个也是不一样的

Animal.run是function,Animal().run是method。method与实例关联,调用时会把实例作为参数隐式传递,function不会。

借楼,function和类关联吗?

永远记住,类只是一个模板,模板是不会亲自下海干活的。

python中如果不加括号,除了个别的,那就是个标识符(你可以理解为变量)。加了括号代表运行前面的东西,比如f就是个标识符,f()代表运行f。

Animal(). run,如果Animal是个类,就代表先运行Animal这个类,记得前面章节说的,类运行变为实例,实例才能亲自下海干活。

Animal(). run就是这个实例里的run函数(run没加括号表示没运行run,仅仅是个函数而已),Animal(). run()就是先运行Animal生成一个实例,然后运行这个实例里的run函数。

你可以试一下Animal. run()也就是运行Animal这个类里的run函数,会报错,告诉你缺少self,这个self是什么呢?就是你创建的实例。再回想一遍前面所说的,类只是个模板,打个比方,网站上的PPT模板怎么能干活呢,你得把它下载下来变成你的实例才能干活。而继承是什么呢,差不多就是,有人把PPT模板复制到另一个PPT模板中,变成了一个新模板(注意是模板)。而拿你的实例做一些东西,比如Animal().run(),或者a=animal();a. run(),就像是在给别人展示你的ppt(不是模板,网上ppt模板怎么能给别人展示呢?),你也可以稍加修改你的ppt(不是修改ppt模板),比如a. eye=blue。

留白A_Z

#5 Created at ... [Delete] [Delete and Lock User]

类里面一般的方法都带有参数self 它指向类的实例,也就是说必须先经过实例化才能调用这个方法,即Class().method(),如果加上装饰器@classmethod 或者@staticmethod 那么就不需要进行实例化就可以调用了,即Class.method()

pipi-hongwy

#6 Created at ... [Delete] [Delete and Lock User]

print(type(Animal().run))

print(type(Animal().run()))

print(type(Animal.run))

输出:

<class 'method'>

<class 'NoneType'>

<class 'function'>

所以这也是为什么声明run方法时,要写个self的原因吗

Animal().run是实例方法,Animal.run是类方法。所谓实例方法,就是必须实例化后才能调用的方法,而类方法则不需要,直接 “类名.方法” 的形式调用。

举个例子, 你定义了一个Animal类,又定义了一个run方法:"def run():",注意方法参数不带self,那么这个方法属于类方法,可以使用“Animal.run()”形式进行调用。

而如果你是这样定义run方法的:“def run(self):”,那么就必须先实例化,再调用。如:

animal = Animal() # 先实例化出一个Animal对象
animal.run()      # 通过对象调用run方法

# 上面两行等同于
Animal().run()

PS:如果run方法是一个类方法,当使用实例化对象调用时,即:

Animal().run()

效果等同于Animal.run(),但是在实际开发过程中不建议这么调用。

大赞,感谢

闹鬼书店

#10 Created at ... [Delete] [Delete and Lock User]

https://www.liaoxuefeng.com/wiki/1016959663602400/1017328655674400

倒回去再看一遍 /函数式编程/高阶函数


  • 1
  • 2

Reply