如何在描述符外部访问存储在python描述符对象中的状态?

时间:2012-01-04 01:14:38

标签: python

是否可以获取存储在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不起作用,但我不知道如何获得转换器的欧元实例。

(我意识到在这个简化的案例中,将欧元作为财产并将价格置于价格上是有道理的,这只是一个简单的例子)

2 个答案:

答案 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)