通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。
Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)
单继承:
class Person(object):
def __init__(self, name,age):
self.name = name
self.age = age
def eat(self):
print("person is eating")
self.num = 10
class Man(Person):
def __init__(self, name, age,money):
super(Man,self).__init__(name, age) ##使用super继承,等于 Person.__init__(self,name,age)
self.money=money
多继承
Python2 经典类是按照深度优先继承的,新式类是按照广度优先继承的
Python3 经典类和新式类都是按照广度优先来继承
当继承多个父类时,多个父类构造函数的参数个数必须相同,否则会报错。
class animal(object):
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print("animal is eating")
self.num = 5
class person(object):
def __init__(self, name,age):
self.name = name
self.age = age
def eat(self):
print("person is eating")
self.num = 10
class Man(person,animal):
def __init__(self, name, age,money): ###python3 init时会按照广度优先
super(Man,self).__init__(name, age) ##使用super多继承
self.money=money
###子类复写父类方法
def eat(self):
super().eat() ##对父类重写时,只能通过super方法来调用父类的方法。正在重写时,无法通过self调用
self.num+=3
###子类调用父类方法
def big_eat(self):
self.eat() ##使用self调用子类的方法,如果子类重写了父类的方法,会调用重写后的方法,没有的话就调用父类的方法。
m1=Man("paul",'22','500')
m1.big_eat()
#>>>person is eating
print(m1.num)
#>>13
综合练习:
class SchoolMember(object):
members = 0 # 初始学校人数为0
def __init__(self, name, age):
self.name = name
self.age = age
def tell(self):
pass
def enroll(self):
'''注册'''
SchoolMember.members += 1
print(" 33[32;1mnew member [%s] is enrolled,now there are [%s] members. 33[0m " % (
self.name, SchoolMember.members))
def __del__(self):
'''析构方法'''
print(" 33[31;1mmember [%s] is dead! 33[0m" % self.name)
class Teacher(SchoolMember):
def __init__(self, name, age, course, salary):
super(Teacher, self).__init__(name, age)
self.course = course
self.salary = salary
self.enroll()
def teaching(self):
'''讲课方法'''
print("Teacher [%s] is teaching [%s] for class [%s]" % (self.name, self.course, 's12'))
def tell(self):
'''自我介绍方法'''
msg = '''Hi, my name is [%s], works for [%s] as a [%s] teacher !''' % (self.name, 'Oldboy', self.course)
print(msg)
class Student(SchoolMember):
def __init__(self, name, age, grade, sid):
super(Student, self).__init__(name, age)
self.grade = grade
self.sid = sid
self.enroll()
def tell(self):
'''自我介绍方法'''
msg = '''Hi, my name is [%s], I'm studying [%s] in [%s]!''' % (self.name, self.grade, 'Oldboy')
print(msg)
if __name__ == '__main__':
t1 = Teacher("Alex", 22, 'Python', 20000)
t2 = Teacher("TengLan", 29, 'Linux', 3000)
s1 = Student("Qinghua", 24, "Python S12", 1483)
s2 = Student("SanJiang", 26, "Python S12", 1484)
t1.teaching()
t2.teaching()
t1.tell()