2021-06-10 Python基础知识——面向对象(4)

一、析构方法

析构方法是指:当一个对象删除或被销毁时,python解析器也会默认调用一个方法,这个方法是 

__del__() 方法。(魔术方法之一)

#示例
class Animal(object):          #创建一个ANimal类
    def __init__(self,name):   #利用__init__方法进行初始化定义
        self.name=name
        print('这是构造初始化的方法')
    def __del__(self):
        print('这是构析方法')
        print('这在没有手动调用情况下,解析器自动调用函数来释放内存空间')
        print('%s被清理了'%self.name)
    pass
d1=Animal('旺财')
d2=Animal('咪咪')

结果:
这是构造初始化的方法
这是构析方法
这在没有手动调用情况下,解析器自动调用函数来释放内存空间
旺财被清理了
这是构造初始化的方法
这是构析方法
这在没有手动调用情况下,解析器自动调用函数来释放内存空间
咪咪被清理了

二、单继承

  • 继承:和现实生活当中的继承是一样的,即子可以继承父的内容(父类的属性和行为),但值得注意的是,父类有的子类都有,但子类有的父类不一定有。
  • 利用好继承可以减少代码的重复书写
#示例
class Animal(object):   #创建一个动物类,以此作为父类
    def eat(self):      #定义一个eat方法
        print('吃饭了')
        pass
    def drink(self):    #定义一个drink实例方法
        print('喝水啦')
        pass
    
class Dog(Animal):      #创建一个狗类,是子类
    def wwj(self):      #定义一个wwj实例方法
        print('小狗在叫')
        pass

class Cat(Animal):      #创建一个猫类,是子类
    def mmj(self):      #定义一个mmj实例方法
        print('小猫在叫')
        pass
    
d1=Dog()                #创建Dog类的对象d1
d1.eat()                #子类的d1拥有父类的eat方法
c1=Cat()                #创建Cat类的对象d2
c1.eat()                #子类的对象c1拥有父类的eat方法 
c1.mmj()                #子类自己的mmj方法

结果:
吃饭了
吃饭了
小猫在叫

三、多继承

  • 多继承如其名所言,一个子类可以继承多个父类,拥有父类们的方法和属性。
#示例
class Animal(object):   #创建一个动物类,以此作为第一个父类
    def eat(self):      #定义一个eat实例方法
        print('大家准备吃饭了')
        
    def drink(self):
        print('大家一起喝水啦')
        
class Run(object):      #创建一个跑步类,以此作为第二个父类   
    def tiao(self):     #定义一个tiao实例方法
        print('边跑边跳起来')
        
class Dog(Animal,Run):   #创建一个狗类,以此作为子类,并且继承动物类和跑步类
    def wwj(self):       #定义一个wwj实例方法
        print('小狗在叫')
        
d1=Dog()                 #创建子类的对象d1
d1.eat()                 #子类的对象d1拥有第一个父类的eat方法
d1.tiao()                #子类的对象d1拥有第二个父类的tiao方法
d1.wwj()                 #子类的的wwj方法

三、重写父类与调用父类

  • 所谓重写,就是在子类中有一个和父类相同名字的方法,导致同名的父类方法被覆盖
  • 这是因为父类的方法已经不再满足子类的方法,那么我们就可以重写父类或者完善父类的方法
#示例1
class Dad(object):        #创建一个父类
    def Smoke(self):      #定义一个Smoke实例方法
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')
class Son(Dad):       #创建一个子类
    def Smoke(Dad):      #定义一个与父类同名的Smoke实例方法,属于重写父类的方法
        print('正在抽好烟')
d1=Son()                #创建Son的对象d1
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖

结果:
正在抽好烟
#示例2

class Dad(object):        #创建一个父类
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def Smoke(self):      #定义一个Smoke方实例法         
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')

class Son(Dad):       #创建一个子类
    def __init__(self):#重新写了父类__init__方法,将其变为空
        pass 
    def Smoke(Dad):      #定义一个与父类同名的Smoke实例方法,属于重写了父类的方法
        print('正在抽好烟')
d1=Son()                #创建Son的对象d1
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖

结果:
正在抽好烟
             
#示例3

class Dad(object):        #创建一个父类
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass

    def Smoke(self):      #定义一个Smoke实例方法         
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')

class Son(Dad):       #创建一个子类
    def Smoke(Dad):      #定义一个与父类同名的方法,属于重写了父类的方法
        print('正在抽好烟')

d1=Son('茄子','yellow')   #创建Son的对象d1,并且给父类__init__方法的name和color赋值
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖
print(d1.name)          #这里可以输出父类的__init__方法的name,但注意的是要在创建对象时赋值
                        #属于调用父类__init__方法

结果:
正在抽好烟
茄子



#示例3的另一种调用父类书写格式

class Dad(object):        #创建一个父类
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass

    def Smoke(self):      #定义一个Smoke实例方法         
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')

class Son(Dad):                        #创建一个子类
    def __init__(self,name,color):     #重新写了父类__init__方法,将其变为空
        Dad.__init__(self,name,color)  #调用父类__init__方法,使其具备name,color实例属性       
    def Smoke(Dad):      #定义一个与父类同名的Smoke方法,属于重写了父类的方法
        print('正在抽好烟')

d1=Son('茄子','yellow') #创建Son的对象d1,并且给父类__init__方法的name和color赋值
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖
print(d1.name)          #这里可以输出父类的__init__方法的name,但注意的是要在创建对象时赋值
                        #属于调用父类__init__方法

结果:
正在抽好烟
茄子




#示例4

class Dad(object):        #创建一个父类
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass

    def Smoke(self):      #定义一个Smoke实例方法         
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')

class Son(Dad):       #创建一个子类
    
    def __init__(self,name,color):#重新写了父类__init__方法,将其变为空
        Dad.__init__(self,name,color)  #调用父类__init__方法
        self.height=161           #原来的父类中不存在的,现在这是自己拓展出来的属性
        self.weight=120           #原来的父类中不存在的,现在这是自己拓展出来的属性
    def __str__(self):
        return '{}的皮肤颜色是:{},他的身高是:{}cm,体重是:{}kg'.format(self.name,self.color,self.height,self.weight)
    def Smoke(Dad):      #定义一个与父类同名的Smoke方法,属于重写了父类的方法
        print('正在抽好烟')

d1=Son('小明','yellow')   #创建Son的对象d1,并且给父类__init__方法的name和color赋值
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖
print(d1.name)          #这里可以输出父类的__init__方法的name,但注意的是要在创建对象时赋值
                        #属于调用父类__init__方法
print(d1)               
print(d1.__str__())     #这两种输出形式都是一样的     

结果:

正在抽好烟
小明
小明的皮肤颜色是:yellow,他的身高是:161cm,体重是:120kg
小明的皮肤颜色是:yellow,他的身高是:161cm,体重是:120kg
#示例5,利用super方法
class Dad(object):        #创建一个父类
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass

    def Smoke(self):      #定义一个Smoke实例方法         
        print('正在抽烟')
    def Drink(self):      #定义一个Drink实例方法
        print ('正在喝酒')

class Son(Dad):       #创建一个子类
    
    def __init__(self,name,color):#重新写了父类__init__方法,将其变为空
        #Dad.__init__(self,name,color)  #调用父类__init__方法
        super().__init__(name,color)#super #是自动找到父类的,进而调用其方法    
                                           #与上一行的手动调用一样结果
                                           #如果有多个父类,则会按顺序去自动查找

        self.height=161           #原来的父类中不存在的,现在这是自己拓展出来的属性
        self.weight=120           #原来的父类中不存在的,现在这是自己拓展出来的属性
    def __str__(self):
        return '{}的皮肤颜色是:{},他的身高是:{}cm,体重是:{}kg'.format(self.name,self.color,self.height,self.weight)
    def Smoke(Dad):      #定义一个与父类同名的Smoke方法,属于重写了父类的方法
        print('正在抽好烟')

d1=Son('小明','yellow')   #创建Son的对象d1,并且给父类__init__方法的name和color赋值
d1.Smoke()              #调用父类的Smoke方法,但是结果会是被子类的Smoke方法给覆盖
print(d1.name)          #这里可以输出父类的__init__方法的name,但注意的是要在创建对象时赋值
                        #属于调用父类__init__方法
print(d1)               
print(d1.__str__())     #这两种输出形式都是一样的     


结果:
正在抽好烟
小明
小明的皮肤颜色是:yellow,他的身高是:161cm,体重是:120kg
小明的皮肤颜色是:yellow,他的身高是:161cm,体重是:120kg

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值