创建接受kwargs的str(或int或float或tuple)的子代

时间:2016-07-25 18:18:19

标签: python python-3.x parent-child subclass kwargs

我需要一个行为类似字符串的类,但还需要额外的kwargs。因此我将str

分类
class Child(str):

    def __init__(self, x, **kwargs):
        # some code ...
        pass


inst = Child('a', y=2)
print(inst)

然而这引起了:

Traceback (most recent call last):
  File "/home/user1/Project/exp1.py", line 8, in <module>
    inst = Child('a', y=2)
TypeError: 'y' is an invalid keyword argument for this function

这很奇怪,因为下面的代码没有任何错误:

class Child(object):

    def __init__(self, x, **kwargs):
        # some code ...
        pass


inst = Child('a', y=2)

问题:

  • 为什么在尝试将strintfloattuple等子类与object,{{{}等其他类进行比较时,我会遇到不同的行为1}},list等?
  • 如何创建一个行为类似字符串但具有的字符串 额外的kwargs?

1 个答案:

答案 0 :(得分:7)

在这种情况下,您需要覆盖__new__,而不是__init__

>>> class Child(str):
...    def __new__(cls, s, **kwargs):
...       inst = str.__new__(cls, s)
...       inst.__dict__.update(kwargs)
...       return inst
...
>>> c = Child("foo")
>>> c.upper()
'FOO'
>>> c = Child("foo", y="banana")
>>> c.upper()
'FOO'
>>> c.y
'banana'
>>>

请参阅here,了解在为__init__strint等不可变类型进行子类化时,为什么覆盖float不起作用的答案:

  

__new__()主要用于允许不可变类型的子类(如int,str或tuple)来自定义实例创建。也是   通常在自定义元类中重写以自定义类   创建