如何在Python中动态添加类方法

2024-02-26

我正在使用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确实有效,但我在测试时犯了一个错误......


您可以随时向类添加函数,这种做法称为猴子修补:

class SadClass:
    pass

@classmethod
def say_dynamic(cls):
    print('hello')
SadClass.say_dynamic = say_dynamic

>>> SadClass.say_dynamic()
hello
>>> SadClass().say_dynamic()
hello

请注意,您正在使用classmethod装饰器,但你的函数不接受任何参数,这表明它被设计为一个static方法。您是否想使用staticmethod反而?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中动态添加类方法 的相关文章

随机推荐