python基础33 继承、组合

单继承下的查找循序

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

复制代码
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属性的查找顺序

多态与多态性

多态:一种事物的多种状态

鸭子类型

复制代码
# 鸭子类型
class Pig:
    def speak(self):
        print('哼哼哼')


class Dog:
    def speak(self):
        print('汪汪汪')


class People:
    def speak(self):
        print('叼毛')


obj = People
obj1 = Pig
obj2 = Dog


def animal(object):
    return object.speak


animal(obj)
animal(obj1)
animal(obj2)
复制代码

如何在父类里面强制限制子类中必须有speak功能

import abc # abstract 抽象的

使用import abc后,只要子类没有父类中限制的功能,那么只要你调用子类中的任何功能都会报错

这个类就变成了:抽象类

 抽象类的特点:只能被继承,不能被实例化!

抽象类中的方法都是抽象方法,而抽象方法不再实现具体的功能,而是用来限制子类的行为

复制代码
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)
复制代码

 

posted @   Py玩家  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示