如何将基类__init__称为self?

时间:2019-02-09 06:08:28

标签: python python-3.x

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

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

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

(否则,connect()中的self.__init__指的是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)

2 个答案:

答案 0 :(得分:2)

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(),以避免子类中的名称冲突。

答案 1 :(得分:0)

  

self .__ init__在connect()中是指comDriver,而不是像它应该的eComm

这不太成立-self指向调用对象,即comDriver。如果您想调用__init__上的eComm方法,而不管它扩展了什么类,则必须显式引用。

eComm.__init__(self)

但是,其他答案和评论是正确的,因为这不是__init__的好用法。