我有一个类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.
如果
SOME_CONSTANT
是在type(sysprops)
上定义的属性,sysprops.SOME_CONSTANT
可以是函数的返回值。在换句话说,如果
sysprops
是一个实例而不是一个类,那么您所说的通常是这样做的。在但是这里的kicker类是元类的实例。因此,关于通过使用类控制实例行为的所有知识同样适用于通过使用元类来控制类的行为。在
通常元类是
type
,但是您可以通过子类化type
来定义其他元类。如果在元类中放置一个属性SOME_CONSTANT
,那么当Python计算sysprops.SOME_CONSTANT
时,该元类的实例,例如sysprops
将具有所需的行为。在收益率
^{pr2}$而另外两个答案都有一个有效的方法。我喜欢走“最少魔法”的路线。在
你可以做一些类似于元类方法的事情,而不需要实际使用它们。只需使用一个装饰器。在
这将创建一个
SysProps
的实例,然后将其分配回SysProps
名称。有效地隐藏实际的类定义并允许一个常量实例。在由于装饰器在Python中更常见,我发现这种方法更容易让其他需要阅读代码的人理解。在
虽然我认为这样做是一个非常坏的主意,但有可能:
相关问题 更多 >
编程相关推荐