Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有像'__获取属性';对于类(而不是实例)变量?_Python - Fatal编程技术网

Python 有没有像'__获取属性';对于类(而不是实例)变量?

Python 有没有像'__获取属性';对于类(而不是实例)变量?,python,Python,我有一个类sysprops,其中我想有一些常量。但是,我希望从数据库中提取这些常量的值,因此我希望在访问这些类常量中的任何一个时使用某种钩子(类似于实例变量的getattribute方法) sysprops。如果SOME\u CONSTANT是在type(sysprops)上定义的属性,则SOME\u CONSTANT可以是函数的返回值 换句话说,如果sysprops是一个实例而不是一个类,那么您所谈论的通常是这样做的 但这里有一个关键点——类是元类的实例。因此,关于通过使用类来控制实例行为的所

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


sysprops。如果
SOME\u CONSTANT
是在
type(sysprops)
上定义的属性,则SOME\u CONSTANT
可以是函数的返回值

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

但这里有一个关键点——类是元类的实例。因此,关于通过使用类来控制实例行为的所有知识都同样适用于通过使用元类来控制类的行为

通常元类是
类型
,但是您可以通过子类化
类型
来自由定义其他元类。如果在元类中放置属性
SOME_常量
,则当Python计算
sysprops.SOME_常量时,该元类的实例(例如
sysprops
)将具有所需的行为


屈服

SOME_VALUE
尽管我认为这样做是一个非常糟糕的主意,但有可能:

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

class sysprops(object):
    __metaclass__ = GetAttributeMetaClass

而另外两个答案有一个有效的方法。我喜欢走“最不神奇”的路线

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

def instancer(cls):
    return cls()

@instancer
class SysProps(object):
    def __getattribute__(self, key):
        return key # dummy
这将创建
SysProps
的实例,然后将其分配回
SysProps
名称。有效地隐藏实际的类定义并允许常量实例


由于修饰符在Python中更为常见,我发现对于其他必须阅读您的代码的人来说,这种方法更容易掌握。

应该注意的是,这使得不可能实例化
SysProps
类。与其使用这种方法,我实际上会选择简单地执行
SysProps=SysProps()。你为什么认为这是个很坏的主意?是因为世界各地的禁忌吗metaclass@ShipluMokaddim一般来说,定义显式属性比隐式属性更好。如果元类已经允许通过动态地向类添加方法/属性来实现某种“魔力”,那么使元类本身具有魔力就更难跟踪代码的工作方式/原因。
class GetAttributeMetaClass(type):
    def __getattribute__(self, key):
        print 'Getting attribute', key

class sysprops(object):
    __metaclass__ = GetAttributeMetaClass
def instancer(cls):
    return cls()

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