继承一个元组 class 不能在 Python 中接受 **kwargs
Inheriting a tuple class cannot take **kwargs in Python
我正在尝试继承可散列的可迭代对象,例如元组。我还想拥有 **kwargs
形式的元数据,但我得到的是 TypeError
在我添加**metadata
之前:
class Collection(tuple):
def __init__(self, pair):#, **metadata):
# self.metadata = metadata
self.pair = tuple(pair)
pair_1 = Collection(["Darth Plagueis", "Darth Sidious"])
pair_1
# ('Darth Plagueis', 'Darth Sidious')
我加上**metadata
后:
class Collection(tuple):
def __init__(self, pair, **metadata):
self.metadata = metadata
self.pair = tuple(pair)
pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
# ---------------------------------------------------------------------------
# TypeError Traceback (most recent call last)
# <ipython-input-119-f40b020d268d> in <module>
# 11 self.metadata = metadata
# 12 self.pair = tuple(pair)
# ---> 13 pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
# 14 pair_1
# 15 # ('Darth Plagueis', 'Darth Sidious')
# TypeError: tuple() takes at most 1 argument (2 given)
#
要覆盖 tuple
class,您需要将 super
初始化放在 __new__
方法中。
class Collection(tuple):
def __new__(self, pair, **metadata):
return super(Collection, self).__new__(self,tuple(pair))
def __init__(self, pair, **metadata):
self.metadata = metadata
self.pair = tuple(pair)
>>> pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
>>> pair_1.pair
('Darth Plagueis', 'Darth Sidious')
>>> pair_1.metadata
{'affiliation': 'Sith'}
我正在尝试继承可散列的可迭代对象,例如元组。我还想拥有 **kwargs
形式的元数据,但我得到的是 TypeError
在我添加**metadata
之前:
class Collection(tuple):
def __init__(self, pair):#, **metadata):
# self.metadata = metadata
self.pair = tuple(pair)
pair_1 = Collection(["Darth Plagueis", "Darth Sidious"])
pair_1
# ('Darth Plagueis', 'Darth Sidious')
我加上**metadata
后:
class Collection(tuple):
def __init__(self, pair, **metadata):
self.metadata = metadata
self.pair = tuple(pair)
pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
# ---------------------------------------------------------------------------
# TypeError Traceback (most recent call last)
# <ipython-input-119-f40b020d268d> in <module>
# 11 self.metadata = metadata
# 12 self.pair = tuple(pair)
# ---> 13 pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
# 14 pair_1
# 15 # ('Darth Plagueis', 'Darth Sidious')
# TypeError: tuple() takes at most 1 argument (2 given)
#
要覆盖 tuple
class,您需要将 super
初始化放在 __new__
方法中。
class Collection(tuple):
def __new__(self, pair, **metadata):
return super(Collection, self).__new__(self,tuple(pair))
def __init__(self, pair, **metadata):
self.metadata = metadata
self.pair = tuple(pair)
>>> pair_1 = Collection(["Darth Plagueis", "Darth Sidious"], affiliation="Sith")
>>> pair_1.pair
('Darth Plagueis', 'Darth Sidious')
>>> pair_1.metadata
{'affiliation': 'Sith'}