如何设计一个类似于root类的python类

时间:2014-03-26 07:42:10

标签: python class operator-overloading

  

编辑:

     

如回复中所述,此问题的搜索关键字是   “在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

1 个答案:

答案 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__,并且它需要有一个值 - 这可以是任何对象,因为它被忽略,所以我使用一片空白。你需要像这样跳过语法箍这一事实应该是一个重要的指标,你应该重新考虑为什么要这样做 - 几乎可以肯定有更好的方法来实现你的目标。