继承的int类不接受其他参数

时间:2018-01-26 16:47:18

标签: python class inheritance built-in

我试图用继承的类解决方案回答this question here,但是当我在我的IDE上测试它时,我的解决方案并没有像我预期的那样出现。我做了一些搜索但找不到答案。

以下是我提出的解决方案:

class PseudoInteger(int):
    def __init__(self, x, base=10, hid_obj=""):
        self.hidden_object = hid_obj
        super(int, PseudoInteger).__init__(x, base)


pseudo_integer = PseudoInteger('5', hid_obj="Hello World")
print(5 + pseudo_integer) # Expects "10"
print(pseudo_integer == 5) # Expects "True"
print(pseudo_integer.hidden_object) # Expects "Hello World!"

根据我的理解,这应该在理论上有效。但是当我运行它时,这就是我得到的:

    pseudo_integer = PseudoInteger('5', hid_obj="Hello World")
TypeError: 'hid_obj' is an invalid keyword argument for this function

我在启动实例时尝试添加base=10但仍然失败:

    pseudo_integer = PseudoInteger('5', base=10, hid_obj="Hello World")
TypeError: int() takes at most 2 arguments (3 given)

我以为我搞砸了一些东西,所以我写了自己的类并继承了它,但它运行良好:

class foo(object):
    def __init__(self, x, y=10):
        pass

class bar(foo):
    def __init__(self, x, y=10, z=""):
        self.z = z
        super(foo, bar).__init__(x, y)

foobar = bar(1, z="hello")
print(foobar.z)

# Output
# hello

我的问题是 - 为什么我不能继承内置的int类并添加一个额外的参数,但是当它从我的foo类继承时它可以正常工作?是限制还是我陷入困境?

除了@Melvin建议的super()不需要Python 3中的args,我在我的自定义类上尝试了它,它的工作原理。但是在内置的继承类中,我得到了另一个意想不到的行为:

    super().__init__(x, base)
TypeError: object.__init__() takes no parameters

内置插件很奇怪。

1 个答案:

答案 0 :(得分:0)

int是不可变的,因此您无法在创建后对其进行修改,请改用__new__。试试这个:

class PseudoInteger(int):
    def __new__(self, x, base=10, hid_obj=""):
        self.hidden_object = hid_obj
        super(int, PseudoInteger).__new__(x, base)

可能重复:Subclassing int in Python