大神解释下,Animal.run和Animal().run 有什么区别?
Topic source永远记住,类只是一个模板,模板是不会亲自下海干活的。
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。
类里面一般的方法都带有参数self 它指向类的实例,也就是说必须先经过实例化才能调用这个方法,即Class().method(),如果加上装饰器@classmethod 或者@staticmethod 那么就不需要进行实例化就可以调用了,即Class.method()
print(type(Animal().run))
print(type(Animal().run()))
print(type(Animal.run))
输出:
<class 'method'>
<class 'NoneType'>
<class 'function'>
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(),但是在实际开发过程中不建议这么调用。
- 1
- 2
老婆说啥都是对的
大神解释下,Animal.run和Animal().run 有什么区别?
我理解的Animal().run是对象的方法,但是Animal.run是什么意思?分别使用type查看类型,2个也是不一样的