Python 继承类'__初始化调用内部函数

Python 继承类'__初始化调用内部函数,python,inheritance,initialization,Python,Inheritance,Initialization,我将从库中继承一个类,但该类的\uuuu init\uuu方法从其内部模块调用一些函数。但是,我也不想使用这些函数。请记住,我不想更改库中的任何代码。我认为,这个库的设计很糟糕,在\uuuuu init\uuuuu方法中调用特定函数并不能让想要使用继承的人生活得更轻松。如果它不是\uuuuu init\uuuu的另一个方法,我可以重写该方法,但我需要从我的类'\uuuuu init\uuuu方法调用super 下面是一些代码来说明这种情况。让我们从库开始: # library: inside o

我将从库中继承一个类,但该类的
\uuuu init\uuu
方法从其内部模块调用一些函数。但是,我也不想使用这些函数。请记住,我不想更改库中的任何代码。我认为,这个库的设计很糟糕,在
\uuuuu init\uuuuu
方法中调用特定函数并不能让想要使用继承的人生活得更轻松。如果它不是
\uuuuu init\uuuu
的另一个方法,我可以重写该方法,但我需要从我的类'
\uuuuu init\uuuu
方法调用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
所以,问题是,如果我调用基类“
\uuuu init\uuuu
,它将在它们的模块中使用它们自己的实现,而不是我在模块
a
中对
某些dict
某些函数的实现。我有一些解决方案,但我想了解什么是最佳实践

可能的解决方案 在子类中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新方法。

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.
# 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.
缺点:如果我不想将库的实现更改为另一种方法,该怎么办。解决方案:我可能会临时更改此选项。初始化后,我可以恢复这些值。大概另一个问题是:如果我以前需要更改这些变量,该怎么办

使用我的软件包的
\uuuu init\uuuu.py
从一开始就更改这些变量。

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.
# 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
的值,那么您认为哪种解决方案更适合于哪种情况?我是否错误地认为基类实现是有问题的,因为它比应该的复杂(例如,导入模块,从内部模块调用函数)?我认为如果他们在一个单独的函数中进行这些调用,这样我就可以重写它,可能会更好。或者,
\uuuuu init\uuuuu
可以接受dict和一个关于这些的函数参数,这样我就可以在对象创建中提供它


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

祝你好运!在他们的
\uuuuu init\uuuuuu
中导入是邪恶的。很遗憾你需要这样做
super.\uuuu init\uuuu
调用,但我想另一种选择是从头开始编写你自己的
\uuuuuu init\uuu
以避免超级。我认为您的
\uuuuu新的\uuuuu
解决方案看起来不错,但在这个阶段,我无法决定什么是最佳实践。如果你能在不造成混乱的情况下让它正常工作,我认为你会做得很好是的,我认为最好的办法是根本不要调用super,而是在您自己的
\uuuu init\uuuu
@PM 2Ring中重新创建相关部分,非常感谢!是的,我想写我的
\uuuu init\uuu
函数可能是个好主意。我猜,我错误地担心,如果我不执行超级调用,我就不能使用
基类的方法,但这是
\uuuuuu新的\uuuuuu方法的工作,所以完全重写基类的
\uuuuu初始\uuuuuuu
是安全的(尽管很不幸)。一个问题是,如果我想使用这个基类进行继承,我必须重写
\uuuuu init\uuuu
。星期一我想多一点(今天没有工作;)——我想除了这个),或者
\uuuuuu init\uuuuuu
或者
\uuuu new\uuuuuuuu
把这个库交出来,把有问题的代码分离出来,发一份公关来。@DanielRoseman,谢谢。我的担忧与我对PM 2Ring的回应相同。如果我能做得更好,我会多想一点;如果没有,我将从头开始实现
\uuuuu init\uuuuu
,或者使用
\uuu new\uuuuu
并通过PR建议对库进行一些代码更改。您想要的不是继承:如果所有相关代码都内联在
基类中,并且太复杂而无法重复,您会怎么说?根本没有干净的方法来假装
库。一个
提供了它没有的可扩展性。这并不是说你的愿望不合理:也许他们应该提供这个功能。