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' @staticmethod缩进搞错了
class CodeA:
@staticmethod
def foo():
print("调用静态方法 foo()")
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 静态方法可以通过类名调用或者实例调用
通过类名:CodeA.foo() hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用
通过类名:
那装饰器的存在还有什么意义? fc5igm 发表于 2021-6-14 19:49
然而打foo还是调用不了
>>> class CodeA:
@staticmethod
def foo():
print("调用静态方法 foo()")
>>> CodeA.foo() # 通过类名调用
调用静态方法 foo()
>>> a=CodeA()
>>> a.foo() # 通过类实例调用
调用静态方法 foo()
>>> hrpzcf 发表于 2021-6-14 19:52
静态方法可以通过类名调用或者实例调用
通过类名:
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。
如果不能实现随意换类且不需对该方法进行设定,那这句话岂不是错了? hrpzcf 发表于 2021-6-14 19:54
class CodeA:
def foo():
print("调用静态方法 foo()")
我不加装饰器,这么写一样可以调用CodeA.foo()
那我加不加装饰器有什么区别? 本帖最后由 hrpzcf 于 2021-6-14 20:11 编辑
fc5igm 发表于 2021-6-14 19:55
如果不能实现随意换类且不需对该方法进行设定,那这句话岂不是错了?
@classmethod
这个装饰过的方法是类方法,只能通过类名调用
@staticmethod
这个装饰过的方法是静态方法,既可以通过实例调用,也可以通过类名调用
这两个是不一样的,要分清楚了。
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。
以上第一条说的就是这个,无需再实例化一个类,可以直接通过类名调用。 hrpzcf 发表于 2021-6-14 20:00
这个装饰过的方法是类方法,只能通过类名调用
有点急了,抱歉
页:
[1]