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