以统一的方式访问类属性和类属性

时间:2018-04-09 08:20:02

标签: python properties

当读取实例属性时,无论它是常规属性还是属性都无关紧要。

但是对于类属性(由所有实例共享),我必须区分这两种类型:

class Prop:
    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        return "VALUE"

class CP: 
    value = Prop()
    other = "OTHER"

print(CP.value.__get__(CP))
print(CP.other)

我需要按名称查找值,我想我需要这样的东西:

v = getattr(CP, attrname)
if hasattr(v, '__get__'):
    return v.__get__(CP)
return v

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

T&&装饰器用于类定义并在实例上访问。因此,如果您想在类上使用属性,则需要在元类中使用property,然后您可以访问类本身的值。

property

但是,请注意,与通过对类的引用或对实例的引用可以访问的普通类变量不同,此metaclass属性只能直接在类上使用:

>>> class TypeWithValue(type):
    @property
    def value(cls):
        return "VALUE"


>>> class CP(metaclass=TypeWithValue):
    pass

>>> CP.value
'VALUE'

python中的每个对象都是某种类型的实例(对于用户定义的类型,这通常是>>> CP().value Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> CP().value AttributeError: 'CP' object has no attribute 'value' )。类本身是类型的实例,通常是名为class的类型,但您可以使用type的子类来应用您自己的行为,该行为在类型的实例中起作用,即在类上