python面向对象下

继承

继承是面向对象的三大特性之一,通过继承可以获得其他类的属性或者方法。

class Animal:
    def run(self):
        print('动物跑起来了')
    def sleep(self):
        print('动物睡觉')
a = Animal()
class dog(Animal):
    print('狗看家')
d = dog()
d.run()#继承了Animal的属性
d.sleep()#继承了Animal的属性
r = isinstance(d,Animal)#检查一个类是否是另一个类的子类
print(r)
'''
狗看家
动物跑起来了
动物睡觉
True
'''

object是所有类的父类

方法的重写(override)

如果在子类中有和父类同名的方法,则通过子类实例去调用方法,会调用子类的方法而不是父类的方法,这个特点就是方法的重写。

class a(object):
    def test(self):
        print('a')
class b(a):
    def test(self):
        print('b')
class c(b):
    def test(self):
        print('c')
d = c()
d.test()
'''
c
'''

调用顺序:d.test()先从类c中去寻找test方法,如果没有再向c的父类中去找
当我们调用一个对象的方法时:
1、会优先去当前对象中寻找是否具有该方法,如果有则直接调用
2、如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
3、如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有则报错

super用法

父类中所有的方法都会被子类继承,包括特殊的方法

class Animal:
    def __init__(self,name):
        self._name = name
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
    def run(self):
        print('动物跑起来了')
    def sleep(self):
        print('动物睡觉')
class dog(Animal):
    def run(self):
        print('狗在跑')
d = dog()
'''
TypeError: __init__() missing 1 required positional argument: 'name'
'''

代码一:

class Animal:
    def __init__(self,name,sex):
        self._name = name
        self._sex = sex
    #*********sex**************
    @property
    def sex(self):
        return self._sex

    @sex.setter
    def sex(self,sex):
        self._sex = sex
    #**********name*************
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
    #************************
    def run(self):
        print('动物跑起来了')
    def sleep(self):
        print('动物睡觉')
class dog(Animal):
    def __init__(self,name,age,sex):
        self._name = name
        self._age = age
        self._sex = sex
    #*******age***************    
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, age):
        self._age = age
    
    def run(self):
        print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)
'''
阿黄
7岁
公
'''

代码二:

class Animal:
    def __init__(self,name,sex):
        self._name = name
        self._sex = sex
    #*********sex**************
    @property
    def sex(self):
        return self._sex

    @sex.setter
    def sex(self,sex):
        self._sex = sex
    #**********name*************
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
    #************************
    def run(self):
        print('动物跑起来了')
    def sleep(self):
        print('动物睡觉')
class dog(Animal):
    def __init__(self,name,age,sex):
        # self._name = name#变化
        self._age = age
        # self._sex = sex#变化
        Animal.__init__(self,name,sex)#变化,上面2行代码变成一行
    #*******age***************
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, age):
        self._age = age

    def run(self):
        print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)

代码三:

class Animal:
    def __init__(self,name,sex):
        self._name = name
        self._sex = sex
    #*********sex**************
    @property
    def sex(self):
        return self._sex

    @sex.setter
    def sex(self,sex):
        self._sex = sex
    #**********name*************
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
    #************************
    def run(self):
        print('动物跑起来了')
    def sleep(self):
        print('动物睡觉')
class dog(Animal):
    def __init__(self,name,age,sex):
        # self._name = name
        self._age = age
        # self._sex = sex
        # Animal.__init__(self,name,sex)#变化地方
        super().__init__(name,sex)
    #*******age***************
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, age):
        self._age = age

    def run(self):
        print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)

多重继承

在python中是支持多重继承的,也就是可以为一个类同时制定多个父类
可以在类名的()后边添加多个类,来实现多重继承
多重继承会使子类同时拥有多个父类,并且会获取到所有父类的方法
注意:在开发中没有特殊情况,应该尽量避免使用多重继承,因为多重继承会让代码更加复杂
多重继承调用方法:会在第一个父类中寻找,然后再找第二个父类…前面的会覆盖后面的
语法:类名.bases

class a(object):
    def test(self):
        print('a')
class b(object):
    def test(self):
        print('b')
class c(a,b):
    def test(self):
        print('c')
print(c.__bases__)
'''
(<class '__main__.a'>, <class '__main__.b'>)
'''
class a(object):
    def test(self):
        print('a')
class b(object):
    def test(self):
        print('b')
class c(a,b):
   pass
# print(c.__bases__)
c = c()
c.test()#先去父类a中寻找test方法,如果没有再去b中寻找。。。。。。。
'''
a
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值