鱼C论坛

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

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

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

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

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

x
本帖最后由 fc5igm 于 2021-6-14 19:53 编辑
class CodeA:
        @staticmethod
    def foo():
        print("调用静态方法 foo()")
class CodeB:
        @classmethod
    def foo(cls):
        print("调用类方法 foo()")
上面小甲鱼给的答案代码,但是敲编辑器里却报错了。请问这个题的答案应该怎么写?
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

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

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

通过类名:
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还是调用不了
>>> class CodeA:
    @staticmethod
    def foo():
        print("调用静态方法 foo()")

>>> CodeA.foo() # 通过类名调用
调用静态方法 foo()
>>> a=CodeA()
>>> a.foo() # 通过类实例调用
调用静态方法 foo()
>>> 
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
class CodeA:

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

使用道具 举报

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

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


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




这两个是不一样的,要分清楚了。
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, 2025-1-15 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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