python基础33 继承、组合

发布时间 2023-06-27 16:21:28作者: 初学程序员

单继承下的查找循序

单继承的意思是一个类只继承一个类

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)