__init__() 是类中特殊的类实例方法,功能为构造函数,在创建类的实例对象时被自动调用。
__init__(self, 参数) 在对象实例化时需要输入相应的参数值。
class MyClass(object):
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
f = MyClass(2,5)
print(f.value1)
print(f.value2)
输出结果:
2
5
构造函数无法继承。
class MyClass(object):
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
def setvalue(self,value3):
self.value3 = value3
class SubMyClass(MyClass):
def __init__(self,value1, value2):
self.value3 = 10
def getvalue(self):
print(self.value3)
f = SubMyClass(1,2)
f.getvalue()
f.setvalue(2)
print(f.value3)
print(f.value2)
输出结果:
AttributeError: 'SubMyClass' object has no attribute 'value2'
10
2
value3的值有变化,说明父类MyClass中的setvalue()方法可以被继承,但是f实例中没有value2,说明__init__()方法不被子类继承。
若需要在子类中调用父类的构造函数,则需要在子类构造函数中绑定父类构造函数或是使用super调用父类中的构造函数,
两种方法:
class MyClass(object):
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
def setvalue(self,value3):
self.value3 = value3
class SubMyClass(MyClass):
def __init__(self,value1, value2):
self.value3 = 10
MyClass.__init__(self, value1,value2) #添加
def getvalue(self):
print(self.value3)
f = SubMyClass(1,2)
f.getvalue()
f.setvalue(2)
print(f.value3)
print(f.value2)
输出结果:
10
2
2
另一种方法是使用Python中的内置函数super()
class MyClass(object):
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
def setvalue(self,value3):
self.value3 = value3
class SubMyClass(MyClass):
def __init__(self,value1, value2):
self.value3 = 10
super().__init__(value1,value2) #另一种方法
# MyClass.__init__(self, value1,value2)
def getvalue(self):
print(self.value3)
f = SubMyClass(1,2)
f.getvalue()
f.setvalue(2)
print(f.value3)
print(f.value2)
结果同上。
对于两种方法的选择,在多重继承和多个超类时有较大区别,具体参考https://blog.youkuaiyun.com/weixin_41798111/article/details/117633137