python:__init__方法的功能是什么

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
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__初始化一个类,但它在下一行的目的是什么?除此之外还有其他选择吗?


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

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

Python文档

There are two typical use cases for super. In a class hierarchy with single inheritance, super can be used to refer to parent classes without naming them explicitly, thus making the code more maintainable. This use closely parallels the use of super in other programming languages.

The second use case is to support cooperative multiple inheritance in a dynamic execution environment.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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类来运行基类中的初始化代码。注意,您还需要仅在一个地方维护代码,而不是在每个类中重复它。


这里发生的是,您从类myThread中的类threading.Thread继承。

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

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