Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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,是否可以获取存储在python描述符中的at状态 例如: 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):

是否可以获取存储在python描述符中的at状态

例如:

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
按预期工作;但是,我想获取存储在管理
p.euros
Convert
描述符中的
rate
,这可能吗?显然,
p.euros.rate
不起作用,但我不确定如何获得转换器的euros实例


(我意识到,在这个简化的例子中,将欧元作为一个属性并将利率放在价格上是有意义的,这只是一个简单的例子)

如果您通过类访问描述符,那么
\uuu get\uu
实例
参数将是无的。您可以检查并返回描述符本身:

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)
然后你会得到这样的速率:

>>> Price.euros.rate
0.75

实际上,@yak在上面对自己答案的评论给出了正确的方法:使用class
\uuu dict\uu
属性

因此,您可以通过执行以下操作来获取描述符(在代码上,它将
p
列为
Price
的一个实例):
p.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

但是请注意,描述符本身是一个“类变量”——因此,在您的示例中,如果需要不同的“Price”对象在“euro”属性上具有不同的“rate”属性,则转换描述符必须将“rate”保持为self.rate,而不是传递给“获取”和“设置”方法


如果是这种情况,您可以直接在实例本身上访问该属性,或者实现一些“get”和“setter”(或嵌套属性)用于处理要在描述符类本身中操作的descriptor属性。

关于如何在不对描述符的实现进行假设的情况下获得该属性,您有什么想法吗?@Finn
Price.\uuuu dict\uuu['euros'].rate
但这是有问题的。如果可以的话,你真的应该修复你的描述符。访问
\Uu dict\Uu
可以完成这项工作,但它是非音阶的,也不是描述符的使用方式。只需说“评估
\Uu dict\Uu
是获取描述符对象的唯一方法,它不是一个实现细节-它正在进行中语言规范指出,对象和类属性的检索是这样工作的。因此,它没有任何“非语法”的地方。