首页 > 解决方案 > 如何将基类 __init__ 称为 self?

问题描述

如何使用 重新初始化基类self.__init__

在下面的示例中,我的目标是继承 eComm,它是一个套接字派生的驱动程序。这处理连接/断开连接。如果它断开连接,我们需要使用 重新初始化它__init__,但是它似乎在调用时引用了 comDriver self.__init__

如何正确初始化超类以允许这样做?

(否则:self.__init__在 connect() 中指的是 comDriver,而不是应有的 eComm)

以下是在 Python 3.x 中重现错误的简单案例

class eComm():

    def __init__(self):
        self.s = "example object"
        self.initialized = True                                    
        self.connected = False                                

    def connect(self, IP_ADDRESS, PORT):                
        if self.initialized:                                
            print(IP_ADDRESS, PORT)
        else:                                        
            print("REINITIALIZING")
            self.__init__()                        
        self.connected = True                             

        return(True)

class comDriver(eComm):

    def __init__(self, IP_ADDRESS, PORT):
        self.IP = IP_ADDRESS
        self.PORT = PORT
        super().__init__()
        pass

    def getTemp(self):
        print("EXAMPLE FUNCTION")
        return(1)

x = comDriver("192", 7)

x.connect("161", 6)
x.initialized = False
x.connect("111", 5)

标签: pythonpython-3.x

解决方案


IMO您__init__错误地使用了特殊方法。它旨在初始化一个 Python 对象,而不是该范围之外的任何东西。

根据您的意图,我建议您创建一个单独的初始化函数,并从__init__. 这是一个例子:

class eComm():
    def __init__(self):
        self.initialize_eComm()

    def initialize_eComm(self):
        self.s = "example object"
        self.initialized = True
        self.connected = False

然后您可以替换self.__init__()self.initialize_eComm()以避免子类中的名称冲突。


推荐阅读