类的继承
继承语法为class 派生类名(基类名):基类名写作括号里,基类是在子类定义的时候在元组之中指明的。即括子类定义时的括号为一个元组,里面为基类的类名。
class A():
pass
class B(A):#B类继承A类
pass
子类调用基类的方法需要用BaseClassName.F(self)
的格式,调用本类的方法的格式为self.F(self)
的格式。
class A():
def print1(self):
print('a... ...')
def print2(self):
print('aa... ...')
class B(A):
def print1(self):
print('b... ...')
def print2(self):
print('bb... ...')
def print3(self):
self.print1() # 调用类中的方法
A.print1(self) # 调用基类的方法
b = B()
b.print3()
子类可以继承基类的所有公有变量和方法,但是不能继承私有变量和方法。
class A():
name = 'abc'
__score = 100
class B(A):
def print1(self):
print(self.name)
# print(self.score) # 基类的私有成员不会被继承
b = B()
b.print1()
可以在括号中选择继承多个基类,以逗号隔开,这种继承被称为多重继承
class A():
namea = 'a'
class B():
nameb = 'b'
class C(A, B):
pass
c = C()
print(c.namea, c.nameb)
如果子类和基类都有__init__()
构造方法,构造方法会被重写,在子类中调用基类方法遵循上面的子类调用基类的函数原则,格式为BaseClassName.F(self)
。也可以用super.__init__()
按照MRO的解析顺序调用基类的构造方法(不过我还没懂MRO)。
class A():
def __init__(self):
print('a... ...')
class B():
def __init__(self):
print('b... ...')
class C(A, B):
def __init__(self):
A.__init__(self) # 用BaseClassName.F(self)的形式调用基类的构造方法
B.__init__(self)
print('c... ...')
c = C()
类的组合
类的继承主要解决的是纵向关系的类,例如交通工具类和高铁、飞机类。类的组合解决的则是横向关系,例如学校和学生、老师。
class Student():
def __init__(self, num):
self.num = num
class Teacher():
def __init__(self, num):
self.num = num
class School():
def __init__(self, num1, num2):
self.student = Student(num1)
self.teacher = Teacher(num2)
school = School(100, 10)
print(school.student.num, school.teacher.num)