这里__init__方法的功能是什么?

时间:2017-08-20 07:46:36

标签: python

class myThread(threading.Thread):

    def __init__(self,str1,str2):
        threading.Thread.__init__(self)
        self.str1 = str1
        self.str2 = str2
    def run(self):
        run1(self.str1,self.str2)

我知道 __ init __ 用于初始化一个类但它在下一行中的用途是什么。有什么替代方法吗?

2 个答案:

答案 0 :(得分:2)

__init__用于初始化类对象。当您创建myThread的新对象时,它首先调用threading.Thread.__init__(self),然后定义两个属性str1和str2。

请注意,您明确调用threading.Thread,这是myThread的基类。最好通过__init__引用父super(myThread, cls).__init__(self)方法。

Python文档

  

超级有两种典型用例。在具有单继承的类层次结构中,super可用于引用父类而不显式命名它们,从而使代码更可维护。这种用法与其他编程语言中super的使用密切相关。

     

第二个用例是在动态执行环境中支持协作多重继承

派生类调用基类init有几个原因。 一个原因是基类在其__init__方法中做了一些特殊的事情。你甚至可能都没有意识到这一点。 另一个原因与 OOP 有关。让我们假设您有一个基类和两个继承它的子类。

class Car(object):
    def __init__(self, color):
        self.color = color

class SportCar(car):
    def __init__(self, color, maxspeed):
        super(SportCar, cls).__init__(self, color)
        self.maxspeed = maxspeed

 class MiniCar(car):
    def __init__(self, color, seats):
        super(MiniCar, cls).__init__(self, color)
        self.seats = seats

这只是为了展示一个示例,但您可以看到SportCar和MiniCar对象如何使用super(CURRENT_CLASS, cls).__init(self, PARAMS)调用Car类来在基类中运行初始化代码。请注意,您还需要仅在一个位置维护代码,而不是在每个类中重复它。

答案 1 :(得分:1)

这里发生的事情是,您继承自班级threading.Thread中的班级myThread

因此,threading.Thread类中的所有函数都可以在继承的类中使用,并且您正在修改类中的函数__init__。因此,它不是运行父类的init方法,而是在您的类中运行__init__方法。

因此,您需要确保在执行修改后的__init__函数之前,父类的__init__方法也会运行。这就是使用语句threading.Thread.__init__(self)的原因。它只调用父类的__init__方法。