对于类(不是实例)变量,是否有类似于''uGetAttribute''uUu'的方法?

2024-06-25 22:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类sysprops,我想在其中有一些常量。但是,我想从数据库中提取这些常量的值,因此我希望在任何时候访问这些类常量时使用某种钩子(类似于实例变量的getattribute方法)。在

class sysprops(object):
    SOME_CONSTANT = 'SOME_VALUE'

sysprops.SOME_CONSTANT  # this statement would not return 'SOME_VALUE' but instead a dynamic value pulled from the database.

Tags: 实例方法数据库objectvaluesomethis钩子
3条回答

如果SOME_CONSTANT是在type(sysprops)上定义的属性,sysprops.SOME_CONSTANT可以是函数的返回值。在

换句话说,如果sysprops是一个实例而不是一个类,那么您所说的通常是这样做的。在

但是这里的kicker类是元类的实例。因此,关于通过使用类控制实例行为的所有知识同样适用于通过使用元类来控制类的行为。在

通常元类是type,但是您可以通过子类化type来定义其他元类。如果在元类中放置一个属性SOME_CONSTANT,那么当Python计算sysprops.SOME_CONSTANT时,该元类的实例,例如sysprops将具有所需的行为。在


class MetaSysProps(type):
    @property
    def SOME_CONSTANT(cls):
        return 'SOME_VALUE'

class SysProps(object):
    __metaclass__ = MetaSysProps


print(SysProps.SOME_CONSTANT)

收益率

^{pr2}$

而另外两个答案都有一个有效的方法。我喜欢走“最少魔法”的路线。在

你可以做一些类似于元类方法的事情,而不需要实际使用它们。只需使用一个装饰器。在

def instancer(cls):
    return cls()

@instancer
class SysProps(object):
    def __getattribute__(self, key):
        return key # dummy

这将创建一个SysProps的实例,然后将其分配回SysProps名称。有效地隐藏实际的类定义并允许一个常量实例。在

由于装饰器在Python中更常见,我发现这种方法更容易让其他需要阅读代码的人理解。在

虽然我认为这样做是一个非常坏的主意,但有可能:

class GetAttributeMetaClass(type):
    def __getattribute__(self, key):
        print 'Getting attribute', key

class sysprops(object):
    __metaclass__ = GetAttributeMetaClass

相关问题 更多 >