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 __ 用于初始化一个类但它在下一行中的用途是什么。有什么替代方法吗?
答案 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__
方法。