类装饰器的疑点

类装饰器的疑点

http://img1.sycdn.imooc.com//climg/5eb3cec809999bc604110366.jpg这里为什么是cls.eat,实例应用的时候也是具体的某只猫cat.eat啊,这前后能对应的原理是什么?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好:cls指代当前类。在调用类方法时也可以使用类名.方法()来调用,但需要传入实例对象作为参数,如下图:

http://img1.sycdn.imooc.com//climg/5eb3f0f00924f50103560376.jpg

此时使用的就是这种写法,需要通过self传递实例对象本身,因此f()必须有一个self参数。如下图:

http://img1.sycdn.imooc.com//climg/5eb3f185098b04ac06410439.jpg

如果解决了你的疑惑,请采纳,祝学习愉快~


  • 江民川 提问者 #1
    老师看我另一个回答。
    2020-05-07 23:55:18
提问者 江民川 2020-05-08 01:06:32

老师之前的答复可能没有完全理解我的意思,“cls是代指当前类”我已经明白了。但我是还想区分一下实例对象和类在实际运用中的概念。如下三张图都能输出相同的内容:

http://img1.sycdn.imooc.com//climg/5eb436f7093d834105350612.jpg

http://img1.sycdn.imooc.com//climg/5eb436fb099e7a6e05300612.jpg

http://img1.sycdn.imooc.com//climg/5eb436ff0974753305080622.jpg

严格意义上来说,图一@eat是相当于图二(给类定义方法,而实例也能用这个方法)还是图三(给实例定义方法)?

  • 同学你好:类方法需要通过@classmethod修饰并传递cls参数指代当前类才是类方法,图2和图3都是实例方法,都传递了self作为参数,self代表实例对象本身,所以是实例方法。图2是将函数通过变量传递进来的,和在类中定义区别不大;而图3使用了函数的嵌套,调用了f(),也和在类中直接定义区别不大。 这里的类装饰器可以理解为类方法与实例方法的结合,因为类方法会使用cls作为当前类,实例方法会使用self作为当前实例对象,而在这个类装饰器中这两个参数都用到了,因此可以这样理解。
    2020-05-08 10:19:38
  • 同学你好:严格意义上来说图一@eat相当于给实例定义方法。 如果解决了你的疑惑,请采纳,祝学习愉快~
    2020-05-08 10:24:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师