python笔记26 析构函数 继承(单,多继承) 父类的重写和调用

在这里插入图片描述

面向对象三大特征: 继承 多态 封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Animal:
    def __init__(self,name):
        self.name=name
        print('这是构造初始化的方法')
        pass
    def __del__(self):   ##释放资源
        print('当在某个作用域下面 没有被使用【引用】的情况下 解析器会自动的调用此函数 来释放内存空间')
        print('这是析构方法')
        print('程序被自动执行')
        pass
    pass

cat=Animal('喵呜')  #构造方法首先执行
input('程序等待中.....')
print('*'*40)
dog=Animal('汪汪')

class Animal:
    def __init__(self,name):
        self.name=name
        print('这是构造初始化的方法')
        pass
    def __del__(self):   ##释放资源
        # 主要应用就是来操作 对象的释放 一旦被释放 对象便不能再使用
        print('当在某个作用域下面 没有被使用【引用】的情况下 解析器会自动的调用此函数 来释放内存空间')
        print('这是析构方法')
        print('程序被自动执行')
        pass
    pass

cat=Animal('喵呜')  #构造方法首先执行
del cat  #手动去清理删除对象 会执行 del 函数  可以看到析构函数被执行 已被清理
input('程序等待中.....')
# print('*'*40)
# dog=Animal('汪汪')

在这里插入图片描述

cat=Animal('喵呜')  #构造方法首先执行
del cat  #手动去清理删除对象 会执行 del 函数  可以看到析构函数被执行 已被清理
print(cat.name)
input('程序等待中.....')
# print('*'*40)
# dog=Animal('汪汪')

在这里插入图片描述
在这里插入图片描述

在python中展现的面向对象的三大特征:
封装 继承 多态
封装:指的是吧内容封装到某个地方,便于后面的使用
需要:
把内容封装到某一个地方
从另外一处地方调用被封装的内容
对于封装来说,其实就是使用初始化构造方法__init)__将内容封装到对象中,然后通过对象直接或者self’间接来获取被封装的内容
继承:和 现实生活中的继承一样 子可以继承父亲的内容[属性和行为] (爸爸有的儿子都有,相反 儿子有的 爸爸不一定有)
所以对于面向对象的继承来说 其实就是将多个类共有的方法提取到父类中 子类仅需继承而不必一一去实现
这样就可以极大的提高效率 减少代码的重复编写 精简代码的层级结构 便于拓展

在这里插入图片描述

class Animal:
    def eat(self):
        '''
        吃
        :return:
        '''
        pass
    def drink(self):
        '''
        喝
        :return:
        '''
        pass
    pass
class Dog:
    def wwj(self):
        print('小狗汪汪叫')
    pass
class Cat:
    def mmj(self):
        print('小猫喵喵叫')
    pass

d1=Dog()
d1.eat()  #不具备吃的行为

在这里插入图片描述

class Animal:
    def eat(self):
        '''
        吃
        :return:
        '''
        print('粑粑吃吗')
        pass
    def drink(self):
        '''
        喝
        :return:
        '''
        pass
    pass
class Dog(Animal):  #继承animal父类 此时dog就是太子,子类
    def wwj(self):
        print('小狗汪汪叫')
    pass
class Cat(Animal):
    def mmj(self):
        print('小猫喵喵叫')
    pass

d1=Dog()
d1.eat()  #具备吃的行为

在这里插入图片描述

多继承

在这里插入图片描述

在这里插入图片描述

class shenxian:
    def fly(self):
        print('不就能飞,哼哼')
        pass
    pass
class Monkey:
    def eatpeach(self):
        print('猴子喜欢吃桃')
        pass
    pass
class Sunwukong(shenxian,Monkey):  #类
    pass
swk=Sunwukong()  #对象
swk.fly()        #行为
swk.eatpeach()

在这里插入图片描述

# 存在相同方法时,需要如何执行 应该调用哪一个
class D(object):
    def eat(self):
        print('该吃饭了,有点子饿')
        pass
    pass
class C(D):  #C中由此方法
    def eat(self):
        print('吃吃吃就知道吃')
        pass
    pass
class B(D):  #B中也没有
    pass
class A(B,C):   #A里面没有eat 去父类中查找
    pass

a=A()
a.eat()  #执行的是C中的内容
# 执行eat方法时,查找顺序为 去A中查找 A无 继续父类中查找 B无 去C中查找 
# 如果C类中无,则去D类中查找
# 顺序: A-B—C—D

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

间接的级联继承

class Grandfather:
    def eat(self):
        print('大郎,吃药')
        pass
    pass
class Father(Grandfather):
    pass
class Son(Father):
    pass

son=Son()
print(Son.__mro__)   ##打印寻找顺序
son.eat()    #从grandfather中继承

在这里插入图片描述
在这里插入图片描述

一般情况下不超过三级

重写父类的方法

在这里插入图片描述

class Grandfather:
    def eat(self):
        print('大郎,吃药')
        pass
    pass
class Father(Grandfather):
    def eat(self):  #因为父类中已经存在这样的方法,在这里相当于方法覆盖了
        print('经常烫头吃海鲜')
    pass
class Son(Father):
    pass

son=Son()
print(Son.__mro__)   ##打印寻找顺序
son.eat()    #从grandfather中继承

在这里插入图片描述

重写父类方法

在这里插入图片描述

所谓重写,就是子类中,有一个和父类相同名字的方阿飞 在子类中的方法会覆盖掉父类中同名的方法
为什么要重写,父类的方法已经不满足子类的需要,那么子类可以重写父类或者完善父类的方法

class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def bark(self):
        print('汪汪')
        pass
    pass
class kjq(Dog):
    def __init__(self):   #重写父类的方法
        pass

    def bark(self):
        print('叫的和神一样')
        pass
    pass
kj=kjq()
kj.bark()

# 如何调用父类的内容

在这里插入图片描述

class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def bark(self):
        print('汪汪')
        pass
    pass
class kjq(Dog):
    def __init__(self,name,color):   #重写父类的方法 覆盖父类
        # 针对这种诉求,调用父类的构造函数
        Dog.__init__(self,name,color) #调用父类的方法 执行完毕就可以具备name和color
        pass

    def bark(self):
        print('叫的和神一样')
        pass
    pass
kj=kjq('柯基犬','红色')
kj.bark()

# 如何调用父类的内容

在这里插入图片描述

拓展父类不具备的属性

class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def bark(self):
        print('汪汪')
        pass
    pass
class kjq(Dog):
    def __init__(self,name,color):   #重写父类的方法
        # 针对这种诉求,调用父类的构造函数
        Dog.__init__(self,name,color) #调用父类的方法 执行完毕就可以具备name和color
        # 扩展其他的属性
        self.height=90
        self.weight=20
        pass
    def __str__(self):
        return '{}的颜色时{} 身高为{} 体重是{} '.format(self.name,self.color,self.height,self.weight)
    def bark(self):
        print('叫的和神一样')
        pass
    pass
kj=kjq('柯基犬','红色')
# kj.bark()
print(kj)

# 如何调用父类的内容

在这里插入图片描述

    Dog.__init__(self,name,color) #手动调用父类的方法 执行完毕就可以具备name和color
	super().__init__(name,color)  #自动调用父类的方法 假设继承了多个父类,那么会按照顺序逐个的去找 然后调用
def bark(self):
    super().bark()  #调用父类的方法
    print('叫的和神一样')
    pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值