今日内容
一、继承应用
1.1在子类派生的新方法中重用父类的功能
方式一:与继承无关,直接调用另一个类的功能
class Summary():
school = "上海校区"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.male = gender
class Student(Summary):
def choose(self):
print("%s 选课成功" % (self.name))
stu1 = Student("aaa",18,"male")
stu2 = Student("bbb",19,"male")
stu3 = Student("ccc",20,"male")
class Teacher():
school = "上海校区"
def __init__(self,name,age,gender,level):
Summary.__init__(self,name,age,gender) #直接调用Summary功能
self.level = level
def score(self):
print("%s 正在打分" % (self.name))
ter1 = Teacher("xxx",38,"male",10)
ter2 = Teacher("yyy",28,"male",1)
print(ter1.__dict__)
方式二:supwe的运用,严格按照继承顺序来查找属性
class Summary():
school = "上海校区"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.male = gender
class Teacher(Summary):
def __init__(self,name,age,gender,level):
super(Teacher, self).__init__(name,age,gender)
self.level = level
def score(self):
print("%s 正在打分" % (self.name))
tea1 = Teacher("XXX",18,"meal",10)
print(tea1.__dict__)
案例一:super是按照发起者的mro列表依次往后查找
class A():
def test(self):
print("from A")
super().test()
class B():
def test(self):
print("from B")
class C(A,B):
pass
obj = C() #当前发起者为C类,C的mro列表为[C,A,B,object],当test先找到A内,
obj.test() #然后A内的super().test()再沿着A继续往下找就找到了B
obj1 = A()
obj1.test() #会报错,因为A内的super().test()会找到object内,而object内没有test
1.2mixins机制
继承表达的是一个is a 的关系,在使用多继承时主要继承的父类放在继承括号的右边,
只需要使用其功能的父类放在左边并取名为Mixins结尾
例:
class Vehicle():
def vehicle(self):
print("交通工具的功能")
class FlyMixins():
def flying(self):
print("飞行的功能")
class CivlAircraft(FlyMixins,Vehicle):
print("明航飞机")
class Helicopter(FlyMixins,Vehicle):
print("直升飞机")
class Car(Vehicle):
print("汽车")
obj2 = CivlAircraft()
obj2.flying()
1.3组合运用
原来继承用的是 is a (某种东西是某一类)的概念,组合是某种东西有某一功能的概念
当你使用的功能不是is a 的概念就用组合
例:
class Summary():
school = "上海校区"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.male = gender
class Student(Summary):
school = "上海校区"
def choose(self):
print("%s 选课成功" % (self.name))
class Teacher():
school = "上海校区"
def __init__(self,name,age,gender,level):
Summary.__init__(self,name,age,gender)
self.level = level
def score(self):
print("%s 正在打分" % (self.name))
class Course():
def __init__(self,name,price,period):
self.name = name
self.price = price
self.period = period
def tell(self):
print("课程信息<%s:%s:%s>" % (self.name,self.price,self.period))
python = Course("python全栈开发",19800,"6mons")
linux = Course("linux",19000,"5mons")
stu1 = Student("XXX",18,"male")
stu1.choose = python #这时stu1不仅能调自己的信息还可以调用python对象的Course类功能
stu1.choose.tell()
print(stu1.name)