Python从不可变类int继承,为什么复制时参数的顺序很重要?

2024-10-05 10:43:11 发布

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

我试图实现一个从int继承的类,并向其中添加一些成员,但我发现派生类的实例无法正确复制(甚至深度复制)。如果参数顺序发生更改,请参见下面的示例,尝试创建一个正int类:

# Example 1
import copy as cp
class PositiveInt(int): 
def __new__(cls, arg = 1, arg0 = 2, arg1 = 3):
    if arg < 0:
        arg = -arg
    return super(PositiveInt, cls).__new__(cls, arg)
def __init__(self, arg = 1, arg0 = 2, arg1 = 3):
    self.arg0 = arg0
    self.arg1 = arg1

n = PositiveInt(3, 4, 5)
m = cp.copy(n)
print(n, n.arg0, n.arg1)
print(m, m.arg0, m.arg1)

将打印:
(3、4、5)
(3、4、5)

# Example 2
class PositiveInt(int):
def __new__(cls, arg0 = 2, arg = 1, arg1 = 3):
    if arg < 0:
        arg = -arg
    return super(PositiveInt, cls).__new__(cls, arg)
def __init__(self, arg0 = 2, arg = 1, arg1 = 3):
    self.arg0 = arg0
    self.arg1 = arg1

n = PositiveInt(4, 3, 5)
m = cp.copy(n)
print(n, n.arg0, n.arg1)
print(m, m.arg0, m.arg1)

将打印:
(3、4、5)
(1、4、5)

唯一的区别是争论的顺序。在示例2中,copy将使用默认值arg在new中实例化,但在示例1中不是这样。你知道吗


Tags: 实例self示例new顺序defargcp
1条回答
网友
1楼 · 发布于 2024-10-05 10:43:11

m = cp.copy(n)最后调用了m = PositiveInt(n),而后者又调用了m=PositiveInt(3)

您可以将__copy__子类化

def __copy__(self):
    return PositiveInt(self.arg0,self,self.arg1)

或者您可以检查__new__中的第一个参数(也许。。。我真的不认为这会起作用)。。。但实际上你应该把__copy__子类化

相关问题 更多 >

    热门问题