面向对象之继承,多态

继承

什么是继承?
'''比如人类和猫类都继承自动物类'''
个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性
在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用

为什么要用继承?
	类解决了对象与对象之间的代码冗余问题
    继承解决了类与类之间的代码冗余问题

怎么使用继承?
	经典类:没有继承object类的子子孙孙类都是经典类
    新式类:继承了object类的子子孙孙类都是新式类
 
#单继承   
 class Animal():
    def __init__(self,name):
        self._name=name

    def shut(self):
        print('shut %s'%self.__class__.__name__)

    @property
    def name(self):
        return self._name

a=Animal('monkey')
a.shut()

class Cat(Animal):  #这里就继承了动物类,单继承
    pass 

cat=Cat('dog')
print(cat.name)  #使用隐藏属性伪装 

#多继承
class parent1():
    pass

class parent2():
    pass

class sub1(parent1):  #单继承
    pass

class sub2(parent1,parent2):  #多继承
    pass

#案例:
class People():

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(People):
    def __init__(self, name, age, stu_nu):
        People.__init__(self,name, age)  #子类里面一定再次调用父类的init方法
        # self是自己的对象
        self.stu_nu = stu_nu


class Teacher(People):
    def __init__(self, name, age, level):
        '''
        #子类里面调用父类的init方法
        注意下面这行代码是指明道姓的调用父类 
        '''
        People.__init__(self,name, age) 
        self.level = level


stu = Student('张三', 20, 1001)
stu.info()
print(stu.name)
print(stu.age)

tea = Teacher('王五', 34, '教授')
tea.info()
print(tea.name)
print(tea.level)

print(stu.name,stu.age,stu.stu_nu)
print(tea.name,tea.age,tea.level)

单继承下的属性查找

单继承下的属性查找:先从对象自己名称空间中查找,然后去产生这个对象的类中查找,最后去继承的父类中查找


多继承下的属性查找

多继承下分菱形查找喝非菱形查找

菱形查找分 经典类喝新式类
经典类:按照深度优先的查找顺序查找
新式类:按照广度优先查找

super和mro的使用

#super()的使用
class Student(People):
    def __init__(self, name, age, stu_nu):
        #换成super后就变成了一个超级对象,超级对象不需要写入自己的self形参,它自己会把这个对象传进去
        super().__init__(name, age)
        # self是自己的对象
        self.stu_nu = stu_nu

stu = Student('张三', 20, 1001)
stu.info()

#mro列表
	每个类都有自己的mro列表,怎么查看mro列表
stu = Student('张三', 20, 1001)
stu.info()
print(Student.__mro__)
#实例化那个对象就mro那个类

多态和鸭子类型

多态它是面向对象的三大特征

什么是多态?
	同一种事物的多种形态
举例:
	水:气态水,液态水,固态水

比如下面这个例子:
	'''狗和猫都继承了动物类,但是他们都有一个共同的特征就是吃
    但是下面又定义了人类,人类也又吃这个动作,我们不需要关心Person是什么对象,只需要关心Person是否有吃的方法,不关心类型'''
    class Animal():  #默认继承object
    def eat(self):
        print('动物要吃东西')

class Dog(Animal):
    def eat(self):  #重写了动物里面eat方面
        print('狗吃肉')

class Cat(Animal):
    def eat(self): #重写了动物里面的eat方法
        print('猫吃骨头')

class Person():
    def eat(self):   #不需要关心Person是什么对象,只需要关心Person是否有吃的方法,不关心类型
        print('人吃五谷杂粮')

def fun(obj):
    obj.eat()

fun(Cat())
fun(Dog())
fun(Person())

抽象类和普通类有什么区别?
	抽象类只能够被继承,不能被实例化
'鸭子类型'
'''鸭子类型就是更多的关注的是对象的行为,而不是对象的类型'''
posted @   家购诗  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示