我已经安装了一个python包(原理图),它有一些从基类扩展的类。
class BaseType(object):
def __init__(self, required=False, default=None ...)
...
class StringType(BaseType):
...
class IntType(BaseType):
...
我希望能够修改BaseType类,因此它会接受其他构造函数变量。
我知道我可以根据这些来定义自己的类,但我想知道Python中是否有一种方法可以修改基类?
谢谢Ben,
答案 0 :(得分:2)
当然可以。只需BaseClass.__init__ = your_new_init
即可。如果BaseClass
在C
中实现,那么这不起作用(我相信你不能可靠地改变用C实现的类的特殊方法;你可以写这个在你自己)。
我相信你想要做的是一个巨大的黑客,只会导致问题,所以我强烈建议你不替换你没有的基类的__init__
甚至写。
一个例子:
In [16]: class BaseClass(object):
...: def __init__(self, a, b):
...: self.a = a
...: self.b = b
...:
In [17]: class A(BaseClass): pass
In [18]: class B(BaseClass): pass
In [19]: BaseClass.old_init = BaseClass.__init__ #save old init if you plan to use it
In [21]: def new_init(self, a, b, c):
...: # calling __init__ would cause infinite recursion!
...: BaseClass.old_init(self, a, b)
...: self.c = c
In [22]: BaseClass.__init__ = new_init
In [23]: A(1, 2) # triggers the new BaseClass.__init__ method
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-23-09f95d33d46f> in <module>()
----> 1 A(1, 2)
TypeError: new_init() missing 1 required positional argument: 'c'
In [24]: A(1, 2, 3)
Out[24]: <__main__.A at 0x7fd5f29f0810>
In [25]: import numpy as np
In [26]: np.ndarray.__init__ = lambda self: 1 # doesn't work as expected
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-26-d743f6b514fa> in <module>()
----> 1 np.ndarray.__init__ = lambda self: 1
TypeError: can't set attributes of built-in/extension type 'numpy.ndarray'
答案 1 :(得分:0)
您可以编辑定义基类的源文件,或者创建包的副本并编辑特定项目的源。
另请参阅:How do I find the location of my Python site-packages directory?