我正在使用Python 3。
我知道 @classmethod 装饰器。另外,我知道可以从实例调用类方法。
class HappyClass(object):
@classmethod
def say_hello():
print('hello')
HappyClass.say_hello() # hello
HappyClass().say_hello() # hello
但是,我似乎无法动态创建类方法并让它们从实例中调用。假设我想要类似的东西
class SadClass(object):
def __init__(self, *args, **kwargs):
# create a class method say_dynamic
SadClass.say_dynamic() # prints "dynamic!"
SadClass().say_dynamic() # prints "dynamic!"
我玩过cls.__dict__
(产生异常),并且setattr(cls, 'say_dynamic', blahblah)
(这只使得该事物可以从类而不是实例中调用)。
如果你问我为什么,我想创建一个惰性类属性。但不能从实例中调用它。
@classmethod
def search_url(cls):
if hasattr(cls, '_search_url'):
setattr(cls, '_search_url', reverse('%s-search' % cls._meta.model_name))
return cls._search_url
也许是因为该属性尚未从类中调用......
总而言之,我想添加一个lazy, class方法可以从实例中调用...这可以以一种优雅(而不是太多线条)的方式实现吗?
有什么想法吗?
我是如何实现的
抱歉,我的例子非常糟糕:\
无论如何,最后我就是这样做的……
@classmethod
def search_url(cls):
if not hasattr(cls, '_search_url'):
setattr(cls, '_search_url', reverse('%s-search' % cls._meta.model_name))
return cls._search_url
And the setattr
确实有效,但我在测试时犯了一个错误......