pyhon和C++一样,允许继承,多继承,方法重写等。继承时,父类必须与派生类定义在一个作用域内 。
一 、 python继承
例如父类Parent
class Parent:
age = 50
name = "asdf"
# 以双下划线开头的是私有成员
__si = 100
# 构造函数
def __init__(self, age, name):
print("先运行父类构造方法")
self.age = age
self.name = name
#普通成员函数,第一个是默认参数self,表示类的示例
def fun(self):
self.__shuchu()
print("i = %d" % self.i)
def OutInfo(self):
print("Parent age = %d" % self.age,"name = " + self.name)
#私有方法
def __shuchu(self):
print("这是私有方法")
def printSiyou(self):
print("私有成员 = %d" % self.__si)
子类Son派生于类Parent
class Son(Parent):
def __init__(self):
print("子类构造函数")
def fun(self):
print("重写了父类的fun方法")
测试代码:
son = Son()
son.OutInfo()
son.fun()
son.printSiyou()
输出结果
子类构造函数
Parent age = 50 name = asdf
重写了父类的fun方法
私有成员 = 100
子类对象在实例化时并没有调用父类的构造函数,这是为什么?
这和C++不同, C++的子类在实例化时会调用父类的构造函数,python有所不同。python如果子类重写了__init__ 时,实例化子类,就不会调用父类已经定义的__init__。
例如下面的代码, 子类不写默认的构造函数,那么,在实例化时,就会先调用父类的构造函数
class Son(Parent):
# def __init__(self):
# print("子类构造函数")
def fun(self):
print("重写了父类的fun方法")
二 、方法重写
如果子类实现了和父类相同的方法,这种成为方法重写,子类在调用时会优先调用重写的方法。
子类想调用父类的构造函数也可以,需要用super方法说明,如下所示:
super(子类,self).__init__(参数1,参数2,....)
代码:
class Son(Parent):
def __init__(self):
print("子类构造函数")
super(Son,self).__init__(60, "tyuio")
def fun(self):
print("重写了父类的fun方法")
三、多继承
写法如下
class DerivedClassName(Base1, Base2, Base3):
.
.
.
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。