我将从库中继承一个类,但是该类的__init__
方法会从其内部模块调用某些函数。但是,我也不想使用这些功能。请记住,我不想更改库中的任何代码。我认为该库的设计很糟糕,在您的__init__
方法中调用特定函数并不能使想要使用继承的人的生活更轻松。如果它不是__init__
之外的其他方法,则可以覆盖该方法,但需要从类的__init__
方法中调用super。
下面是一些代码来说明这种情况。让我们从库开始:
# library: inside of module a
class BaseClass(object):
def __init__(self, *args, **kwargs):
# initialize params
from utils import some_func, some_dict
some_func(...)
for key in some_dict.keys():
# do stuff
# library: inside of module utils
some_dict = {...}
def some_func(args): # do stuff
这是我的代码:
# inside of a one module.
from A import BaseClass
class SubClass(BaseClass):
def __init__(self, *args, **kwargs):
super(SubClass, self).__init__(*args, **kwargs)
# Also I have implementation for the dict and some_func.
# inside of module a (my code not the library)
some_dict = {...}
def some_func(args): # do stuff
因此,问题是,如果我对BaseClass的__init__
进行调用,它将在其模块中使用其自己的实现,而不是我对some_dict
和some_func
的实现。模块a
。我有一些解决方案,但我想了解什么是最佳做法。
在子类内部使用__new__
方法。
class SubClass(BaseClass):
# ...
def __new__(typ, ...):
import library.a
from a import some_dict, some_func
library.a.some_dict = some_dict # replace it with my dict.
library.a.some_func = some_func # replace it with my function.
缺点:如果我不想为其他方法更改库的实现,该怎么办?解决方案:我可以更改此临时文件。初始化之后,我可以将这些值还原回去。也许。另一个问题是:如果我之前需要更改这些变量怎么办?
使用我程序包的__init__.py
一开始更改这些变量。
# inside of `__init__`.py of my package. Very beginning.
import library.a
from a import some_dict, some_func
library.a.some_dict = some_dict # replace it with my dict.
library.a.some_func = some_func # replace it with my function.
是否有解决此问题的好方法?我认为,在这种情况下,我可以在整个代码执行过程中更改some_dict
和some_func
的值,因此您认为哪种解决方案在哪种条件下会更好?我是否在错误地认为BaseClass实现存在问题,因为它比它应该的复杂得多(例如,导入模块,从该内部模块调用函数)?我认为如果他们在一个单独的函数中进行这些调用可能会更好,这样我就可以覆盖它。或者,__init__
可以接受dict和与此相关的函数参数,以便在创建对象时提供它。
这种情况下的最佳做法是什么?