使用多个 __init__ 参数对元组进行子类化
- 2025-03-05 09:18:00
- admin 原创
- 2
问题描述:
以下代码有效:
class Foo(tuple):
def __init__(self, b):
super(Foo, self).__init__(tuple(b))
if __name__ == '__main__':
print Foo([3, 4])
$ python play.py
结果:
play.py:4: DeprecationWarning: object.__init__() takes no parameters
super(Foo, self).__init__(tuple(b))
(3, 4)
但不包括以下内容:
class Foo(tuple):
def __init__(self, a, b):
super(Foo, self).__init__(tuple(b))
if __name__ == '__main__':
print Foo(None, [3, 4])
$ python play.py
结果:
Traceback (most recent call last):
File "play.py", line 7, in <module>
print Foo(None, [3, 4])
TypeError: tuple() takes at most 1 argument (2 given)
为什么?
解决方案 1:
因为元组是不可变的,所以你必须覆盖__new__
:
Python 文档
object.__new__(cls[, ...])
调用以创建类 的新实例
cls
。__new__()
是一个静态方法(特殊情况,因此您无需将其声明为静态方法),该方法将请求实例的类作为其第一个参数。其余参数是传递给对象构造函数表达式(对类的调用)的参数。 的返回值__new__()
应该是新的对象实例(通常是 的实例cls
)。
__new__()
典型的实现是通过使用适当的参数调用超类的方法
来创建该类的新实例super(currentclass, cls).__new__(cls[, ...])
,然后在返回新创建的实例之前根据需要对其进行修改。如果
__new__()
返回的实例
cls
,那么新实例的
__init__()
方法将像一样被调用__init__(self[, ...])
,其中 self 是新实例并且其余参数与传递给的相同__new__()
。如果
__new__()
没有返回的实例cls
,那么新实例的__init__()
方法将不会被调用。
__new__()
主要用于允许不可变类型(如 、 或 )的子类
int
自str
定义tuple
实例创建。它还通常在自定义元类中被重写,以便自定义类创建。
解决方案 2:
要分配元组值,您需要重写该__new__
方法:
class Foo(tuple):
def __new__ (cls, a, b):
return super(Foo, cls).__new__(cls, tuple(b))
元组类的实现似乎忽略了这些参数__init__
,但如果您需要做一些初始化操作,您可以按如下方式执行:
class Foo(tuple):
def __new__ (cls, a, b):
return super(Foo, cls).__new__(cls, tuple(b))
def __init__(self, a, b):
self.a=a
self.b=b
if __name__ == '__main__':
foo = Foo(None, [3, 4])
print foo
print foo.a
print foo.b
相关推荐
热门文章
项目管理软件有哪些?
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD