鱼C论坛

 找回密码
 立即注册
查看: 1919|回复: 9

[已解决]40讲课后作业答案无法复现

[复制链接]
发表于 2021-6-14 19:38:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 fc5igm 于 2021-6-14 19:53 编辑
  1. class CodeA:
  2.         @staticmethod
  3.     def foo():
  4.         print("调用静态方法 foo()")
复制代码
  1. class CodeB:
  2.         @classmethod
  3.     def foo(cls):
  4.         print("调用类方法 foo()")
复制代码

上面小甲鱼给的答案代码,但是敲编辑器里却报错了。请问这个题的答案应该怎么写?
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

哪怕缩进正确,可以运行了,但是输入foo也还是无法调用。无法复现甲鱼宣称的功能
  1. >>> class Test:
  2.         def test(self):
  3.                 pass

  4.        
  5. >>> Test.foo
  6. Traceback (most recent call last):
  7.   File "<pyshell#45>", line 1, in <module>
  8.     Test.foo
  9. AttributeError: type object 'Test' has no attribute 'foo'
  10. >>> Test.foo()
  11. Traceback (most recent call last):
  12.   File "<pyshell#46>", line 1, in <module>
  13.     Test.foo()
  14. AttributeError: type object 'Test' has no attribute 'foo'
复制代码
最佳答案
2021-6-14 19:48:03
@staticmethod缩进搞错了
  1. class CodeA:
  2.     @staticmethod
  3.     def foo():
  4.         print("调用静态方法 foo()")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-14 19:48:03 | 显示全部楼层    本楼为最佳答案   
@staticmethod缩进搞错了
  1. class CodeA:
  2.     @staticmethod
  3.     def foo():
  4.         print("调用静态方法 foo()")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-14 19:49:49 | 显示全部楼层
hrpzcf 发表于 2021-6-14 19:48
@staticmethod缩进搞错了

然而打foo还是调用不了
  1. >>> foo
  2. Traceback (most recent call last):
  3.   File "<pyshell#40>", line 1, in <module>
  4.     foo
  5. NameError: name 'foo' is not defined
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-14 19:52:47 | 显示全部楼层
静态方法可以通过类名调用或者实例调用

通过类名:
  1. CodeA.foo()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-14 19:53:51 | 显示全部楼层
hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用

通过类名:

那装饰器的存在还有什么意义?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-14 19:54:32 | 显示全部楼层
fc5igm 发表于 2021-6-14 19:49
然而打foo还是调用不了
  1. >>> class CodeA:
  2.     @staticmethod
  3.     def foo():
  4.         print("调用静态方法 foo()")

  5. >>> CodeA.foo() # 通过类名调用
  6. 调用静态方法 foo()
  7. >>> a=CodeA()
  8. >>> a.foo() # 通过类实例调用
  9. 调用静态方法 foo()
  10. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-14 19:55:27 | 显示全部楼层
hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用

通过类名:
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

如果不能实现随意换类且不需对该方法进行设定,那这句话岂不是错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-14 19:58:09 | 显示全部楼层
  1. class CodeA:

  2.     def foo():
  3.         print("调用静态方法 foo()")
复制代码

我不加装饰器,这么写一样可以调用CodeA.foo()
那我加不加装饰器有什么区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-14 20:00:48 | 显示全部楼层
本帖最后由 hrpzcf 于 2021-6-14 20:11 编辑
fc5igm 发表于 2021-6-14 19:55
如果不能实现随意换类且不需对该方法进行设定,那这句话岂不是错了?

  1. @classmethod
复制代码

这个装饰过的方法是类方法,只能通过类名调用



  1. @staticmethod
复制代码

这个装饰过的方法是静态方法,既可以通过实例调用,也可以通过类名调用




这两个是不一样的,要分清楚了。

  1. classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。
复制代码

以上第一条说的就是这个,无需再实例化一个类,可以直接通过类名调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-14 20:40:34 | 显示全部楼层
hrpzcf 发表于 2021-6-14 20:00
这个装饰过的方法是类方法,只能通过类名调用

有点急了,抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 16:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表