单继承下的属性查找顺序
# class Foo: # def f1(self): # print('from Foo.f1') # # def f2(self): # print('from Foo.f2') # self.f1() # # # class Bar(Foo): # def f1(self): # print('from Bar.f1') # # # 属性查找的顺序:现在对象自己的名称空间中查找,在去产生对象的类中查找,在去继承的类中查找 # # obj = Bar() # obj.f2() class Foo: def __f1(self): # _Foo__f1() print('from Foo.f1') def f2(self): print('from Foo.f2') self.__f1() # _Foo__f1() class Bar(Foo): def __f1(self): # _Bar__f1() print('from Bar.f1') # 属性查找的顺序:现在对象自己的名称空间中查找,在去产生对象的类中查找,在去继承的类中查找 obj = Bar() obj.f2()
多继承下的属性查找顺序
# 经典类:深度优先查询 # 新式类:广度优先查询 class G(object): # def test(self): # print('from G') pass class E(G): # def test(self): # print('from E') pass class B(E): # def test(self): # print('from B') pass class F(G): # def test(self): # print('from F') pass class C(F): # def test(self): # print('from C') pass class H(): # def test(self): # print('from C') pass class D(H): # def test(self): # print('from D') pass class A(B, C, D): # def test(self): # print('from A') pass f1 = A() f1.test()
super和mro列表
# class People(): # school = 'SH' # # def __init__(self, name, age, gender): # self.name = name # self.age = age # self.gender = gender # # # class Student(People): # def __init__(self, name, age, gender, course=None): # if course is None: # course = [] # # People.__init__(self, name, age, gender) # 指名道姓的调用 # # super(Student, self) 返回的是一个特殊的对象 # # super(Student, self).__init__(name, age, gender) # python2中的写法 # super().__init__(name, age, gender) # python3中的写法 # self.course = course # # def choose_course(self): # print('aaaa') # # stu = Student('tom', 19, 'male') # print(stu.school) # class Teacher(People): # def __init__(self, name, age, gender, level): # People.__init__(self, name, age, gender) # self.level = level # # def score(self): # print('打分') class A(): def test(self): super().test() class B: def test(self): print('from B') class C(A, B): pass c = A() c.test()
多态与多态性
多态:同一种事物的多种形态 水:液态,固态,气态 动物:人,猪,狗,猫... Animal类已经变成抽象类了, 抽象类的特点:只能被继承,不能被实例化 class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self):pass class People(Animal): def jiao(self): pass def speak(self): pass class Pig(Animal): def speak(self): pass class Dog(Animal): def speak(self): pass obj1 = People() obj1.speak()
组合
# 组合:一个对象拥有一个属性,该属性的值是另外一个对象 继承:满足什么是什么的关系 组合:满足什么有什么的关系 class People(): school = 'SH' def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender class Course(): def __init__(self, name, period, price): self.name = name self.period = period self.price = price python=Course('python', '6mon', 30000) linux=Course('linux', '5mon', 20000) # print(python.name) # print(python.period) # print(python.price) class Student(People): def __init__(self, name, age, gender, course=None): if course is None: course = [] # People.__init__(self, name, age, gender) # 指名道姓的调用 # super(Student, self) 返回的是一个特殊的对象 # super(Student, self).__init__(name, age, gender) # python2中的写法 super().__init__(name, age, gender, ) # python3中的写法 self.course = course def choose_course(self): print('aaaa') stu = Student('tom', 19, 'male') stu.course.append(python) stu.course.append(linux) for i in stu.course: print(i.name)