fc5igm 发表于 2021-6-14 19:38:36

40讲课后作业答案无法复现

本帖最后由 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'

hrpzcf 发表于 2021-6-14 19:48:03

@staticmethod缩进搞错了
class CodeA:
    @staticmethod
    def foo():
      print("调用静态方法 foo()")

fc5igm 发表于 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

hrpzcf 发表于 2021-6-14 19:52:47

静态方法可以通过类名调用或者实例调用

通过类名:CodeA.foo()

fc5igm 发表于 2021-6-14 19:53:51

hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用

通过类名:

那装饰器的存在还有什么意义?

hrpzcf 发表于 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()
>>>

fc5igm 发表于 2021-6-14 19:55:27

hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用

通过类名:

classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。
如果不能实现随意换类且不需对该方法进行设定,那这句话岂不是错了?

fc5igm 发表于 2021-6-14 19:58:09

hrpzcf 发表于 2021-6-14 19:54


class CodeA:

    def foo():
      print("调用静态方法 foo()")
我不加装饰器,这么写一样可以调用CodeA.foo()
那我加不加装饰器有什么区别?

hrpzcf 发表于 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() 调用,而无需绑定实例对象了。
以上第一条说的就是这个,无需再实例化一个类,可以直接通过类名调用。

fc5igm 发表于 2021-6-14 20:40:34

hrpzcf 发表于 2021-6-14 20:00
这个装饰过的方法是类方法,只能通过类名调用




有点急了,抱歉
页: [1]
查看完整版本: 40讲课后作业答案无法复现