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

2024-04-27 03:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

EDIT:

As mentioned in the responses, search keyword for this question is "assignment operator overloading in 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


Tags: theinforsearchisasresponsesthis
1条回答
网友
1楼 · 发布于 2024-04-27 03:12:04

你不能做到这一点:

y = MyClass()
y = 3
y = 5
y.previous_value() # will yield 3

Python中的赋值将名称重新绑定到另一个对象。执行y = 3时,y现在是整数3的名称,而不是MyClass的实例的名称。这种行为完全不依赖于旧的RHS,如果没有deepmagic(您可以可能使用上下文管理器做一些事情),它就无法拦截。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__,它需要有一个值-这可以是任何对象,因为它被忽略了,所以我使用一个空切片。事实上,你需要跳过这样的语法环应该是一个重要的指标,你应该重新思考你为什么要这样做-几乎可以肯定有一个更好的方法来实现你的目标。你知道吗

相关问题 更多 >