单继承下的查找循序
单继承的意思是一个类只继承一个类
class D(): pass class C(D): pass class B(C): pass class A(B): pass
如何查找继承下的属性和方法呢
class Foo(): def __f1(self): # _Foo__f1() print("Foo.f1") def f2(self): # obj: print("Foo.f2") self.__f1() # self._Foo__f1() class Bar(Foo): def __f1(self): # _Bar__f1() print("Bar.f1") obj = Bar() obj.f2() # obj.f2(obj)
单继承下的属性查找顺序:先从对象自己的名称空间中查找,然后去产生这个对象的类中查找,最后在去继承的父类中查找
多继承下的属性查找
一个类可以继承多个类
"""python支持多继承""" class D(): pass class C(D): pass class B(C, D): pass class A(B,C,D): pass
多继承下的属性查找分为:菱形查找和非菱形查找
非菱形查找:
菱形查找分:
经典类:按照深度优先查询
新式类:按照广度优先查询
在python3中都是新式类,所以,多继承下的属性查找,如果属性找不到,就按照广度优先查询
一般情况下,最好不使用多继承
super关键字
如果你继承的类中出现了super()关键字的用法,就要使用mro列表来查找属性
class A: def test(self): super().test() class B: def test(self): print('from B') class C(A, B): pass a = A() a.test()
print(c.mro)列表就是c属性的查找顺序
多态与多态性
多态:一种事物的多种状态
如何在父类里面强制限制子类中必须有speak功能
import abc # abstract 抽象的
这个类就变成了:抽象类
抽象类的特点:只能被继承,不能被实例化!
抽象类中的方法都是抽象方法,而抽象方法不再实现具体的功能,而是用来限制子类的行为
class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod # 抽象方法 def speak(self): pass @abc.abstractmethod def jiao(self): pass class People(Animal): def speak(self): pass ... class Dog(Animal): def speak(self): pass
obj = People()
obj1 = Dog()
obj.speak()
obj1.speak()
组合
组合它不是一个新技术,就是之前我们学习的知识点
组合:就是一个对象拥有一个属性,该属性的值是另外一个对象
class Foo(): def__init__(self,m): self.m=m class Bar(): def__init__(self,n): seif.n=n obj=Foo(10) obj1=Bar(20) obj.x=obj1 print(obj.x.n)
继承一般用在什么是什么的时候
组合一般用在什么有什么的时候
class People(): def __init__(self, name, age, gender): """这个是指名道姓的调用方法,不依赖于继承""" self.name = name self.age = age self.gender = gender class Course(): def __init__(self, course_name, course_price, course_period): """这个是指名道姓的调用方法,不依赖于继承""" self.course_name = course_name self.course_price = course_price self.course_period = course_period python=Course("python", 10000, '6mon') linux = Course("linux", 20000, '5mon class Student(People): def __init__(self, name, age, gender, course=None): if course is None: course = [] """这个是指名道姓的调用方法,不依赖于继承""" super(Student, self).__init__( name, age, gender) self.courses = course def choose_course(self): pass stu = Student('kevin', '19', 'male') stu.courses.append(python) stu.courses.append(linux) print(stu.courses)
标签:__,course,python,继承,class,33,pass,self,def From: https://www.cnblogs.com/shanghaipudong/p/17508945.html