当读取实例属性时,无论它是常规属性还是属性都无关紧要。
但是对于类属性(由所有实例共享),我必须区分这两种类型:
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
有更好的方法吗?
答案 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
的子类来应用您自己的行为,该行为在类型的实例中起作用,即在类上