|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
之前课程里有讲过装饰器的联用,我将@property变成了下面的形式,为啥会报错呢?有没有什么好的解决办法呢?
class D:
@classmethod
def __doc__(cls):
return f"hi,this is{cls.__name__}"
__doc__ = property(__doc__)
d = D()
d.__doc__
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
d.__doc__
TypeError: 'classmethod' object is not callable
本帖最后由 isdkz 于 2023-2-22 06:01 编辑
classmethod是为了让property对象去调用相应的方法的时候可以自动传入 cls 参数
这里出错是因为你先把 __doc__ 装饰成了 classmethod 对象,classmethod 对象是不能被直接调用的,它只能通过类和对象来去调用,
所以 property对象 去自动调用一个已经被装饰成 classmethod 对象的方法的时候就会报 classmethod' object is not callable 的错误,
所以不能在 property 之前把方法装饰成 classmethod 对象,都使用装饰器的时候是这样的:
@classmethod
@property
def __doc__
越靠近函数的装饰器是先装饰的,如果 property 使用函数的话,classmethod 就不能使用装饰器了,
因为装饰器只能在函数定义的时候使用,如果 classmethod 得在 property 之后的话也得使用函数
故对你的代码修改如下:
- class D:
- def __doc__(cls):
- return f"hi,this is {cls.__name__}"
- __doc__ = classmethod(property(__doc__))
- d = D()
- print(d.__doc__)
复制代码
|
|