继承一个类,其中该类的__init__调用内部函数

时间:2018-09-15 18:03:45

标签: python inheritance initialization

我将从库中继承一个类,但是该类的__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_dictsome_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_dictsome_func的值,因此您认为哪种解决方案在哪种条件下会更好?我是否在错误地认为BaseClass实现存在问题,因为它比它应该的复杂得多(例如,导入模块,从该内部模块调用函数)?我认为如果他们在一个单独的函数中进行这些调用可能会更好,这样我就可以覆盖它。或者,__init__可以接受dict和与此相关的函数参数,以便在创建对象时提供它。

这种情况下的最佳做法是什么?

0 个答案:

没有答案