gpt4 book ai didi

python - 在 Python 中扩展基类

转载 作者:太空狗 更新时间:2023-10-29 17:53:50 28 4
gpt4 key购买 nike

我正在尝试扩展 Python 中的一些“基”类:

class xlist (list):
def len(self):
return len(self)

def add(self, *args):
self.extend(args)
return None


class xint (int):
def add(self, value):
self += value
return self


x = xlist([1,2,3])
print x.len() ## >>> 3 ok
print x ## >>> [1,2,3] ok
x.add (4, 5, 6)
print x ## >>> [1,2,3,4,5,6] ok

x = xint(10)
print x ## >>> 10 ok
x.add (2)
print x ## >>> 10 # Not ok (#1)

print type(x) ## >>> <class '__main__.xint'> ok
x += 5
print type(x) ## >>> <type 'int'> # Not ok (#2)

它在 list 情况下工作正常,因为 append 方法“就地”修改对象,而不返回它。但在 int 情况下,add 方法不会修改外部 x 变量的值。我想这很好,因为 self 是类的 add 方法中的局部变量,但这阻止了我修改分配给实例的初始值类。

是否可以通过这种方式扩展一个类,或者我是否应该使用基类型定义一个类属性并将所有需要的方法映射到该属性?

最佳答案

您的两个 xint 示例由于两个不同的原因而不起作用。

第一个不起作用,因为 self += value 等同于 self = self + value 只是重新分配局部变量 self到不同的对象(整数)但不更改原始对象。你真的不能得到这个

>>> x = xint(10)
>>> x.add(2)

使用 int 的子类,因为整数是 immutable .

要让第二个工作,你可以定义一个 __add__ method ,像这样:

class xint(int):
def __add__(self, value):
return xint(int.__add__(self, value))

>>> x = xint(10)
>>> type(x)
<class '__main__.xint'>
>>> x += 3
>>> x
13
>>> type(x)
<class '__main__.xint'>

关于python - 在 Python 中扩展基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33534/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com