是否可以获取存储在python描述符中的状态?
例如:
class Price(object):
def __init__(self, dollars):
self.dollars = dollars
class Convert(object):
def __init__(self, rate):
self.rate = rate
def __get__(self, instance, owner):
return instance.dollars * self.rate
euros = Convert(0.75)
p = Price(20.0)
print p.dollars
print p.euros
按预期工作;但是,我想知道存储在管理rate
的{{1}}描述符中的Convert
是否可能?显然p.euros
不起作用,但我不知道如何获得转换器的欧元实例。
(我意识到在这个简化的案例中,将欧元作为财产并将价格置于价格上是有道理的,这只是一个简单的例子)
答案 0 :(得分:3)
实际上,@ yak对自己上面回答的评论给出了正确的方法:使用类__dict__
属性。
因此,您可以通过执行以下操作来获取描述符(在您的代码上,将p
列为Price
的实例):
p.__class__.__dict__["euros"]
但请注意,描述符本身是一个“类变量” - 所以,仍然在你的例子中,如果你需要不同的“Price”对象在“euro”属性上有不同的“rate”属性,转换描述符必须保持“rate”不是self.rate,而是在传递给“__get__”和“__set__”方法的“instance”参数的某些(可能是名称损坏的)属性中。
如果是这种情况,您可以直接在实例本身上访问该属性 - 或者实现一些“get”和“setters”(或嵌套属性)来处理您想要在描述符类中操作的descirptor属性本身。
答案 1 :(得分:2)
如果通过类访问描述符,instance
的{{1}}参数将为None。您可以检查并返回描述符本身:
__get__
然后你得到这样的费率:
class Price(object):
def __init__(self, dollars):
self.dollars = dollars
class Convert(object):
def __init__(self, rate):
self.rate = rate
def __get__(self, instance, owner):
if instance is None:
# Accessed through class, return the descriptor instead.
return self
return instance.dollars * self.rate
euros = Convert(0.75)