我试图用继承的类解决方案回答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
内置插件很奇怪。
答案 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)