编辑:
如回应中所述,此问题的搜索关键字是“ python中的赋值运算符重载”。
我想构造一个类,其行为类似于整数或字符串类。像这样的东西:
x = "hello"
x.upper() # says "HELLO"
y = MyClass()
y = 3
y = 5
print(y) # will print 5
y.previous_value() # will yield 3
我该如何建立一个像这样的类?
目前最接近的黑客是这样的:https : //stackoverflow.com/a/6012807/1952991
您无法实现此目的:
y = MyClass()
y = 3
y = 5
y.previous_value() # will yield 3
Python中的分配将名称重新绑定到另一个对象。这样做时y = 3
,y
现在是整数3的名称,而不是的实例的名称MyClass
。此行为不依赖于旧RHS可言,而且不能被它而不拦截深魔术(你能可能做上下文管理器的东西)。MyClass
曾经用来引用的y实例不知道y不再引用它(或者它一开始就引用);即使这样做,y.previous_value()
也会在int而不是MyClass
实例上调用方法。
您能做的最接近的是__setitem__
。当您执行以下操作时,这是Python调用的钩子:
x = [1, 2, 3]
x[2] = 5
第二行翻译为x.__setitem__(2, 5)
。使用此功能,您可以玩以下有趣的游戏:
class MyClass:
def __init__(self):
self.values = []
def __setitem__(self, item, value):
self.value.append(value)
def previousvalue(self):
return self.values[-2]
def __str__(self):
return str(self.values[-1])
x = MyClass()
x[:] = 5
x[:] = 6
print(x.previousvalue())
请注意,您需要将[]
到触发__setitem__
,它需要有一个价值-它可以是任何对象,因为它被忽略,所以我用一个空切片。您需要跳过这样的句法箍圈这一事实应该是您应该重新考虑为什么要这样做的一个重要指标-几乎可以肯定,有一种更好的方法可以实现您的目标。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句