编辑:
如回复中所述,此问题的搜索关键字是 “在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
答案 0 :(得分:1)
你无法做到这一点:
y = MyClass()
y = 3
y = 5
y.previous_value() # will yield 3
Python中的赋值将名称重新绑定到另一个对象。执行y = 3
时,y
现在是整数3的名称,而不是MyClass
的实例。这种行为根本不依赖于旧的RHS,并且在没有深魔法的情况下不会被它截获(你可以可能用上下文做某事经理)。 y过去所指的MyClass
实例并不知道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__
,并且它需要有一个值 - 这可以是任何对象,因为它被忽略,所以我使用一片空白。你需要像这样跳过语法箍这一事实应该是一个重要的指标,你应该重新考虑为什么要这样做 - 几乎可以肯定有更好的方法来实现你的目标。