从零开始学python之继承

本文介绍了Python面向对象编程中的继承机制,包括单继承和多继承,展示了如何通过继承扩展类的功能。同时,讨论了方法重写的概念,即子类如何覆盖父类的方法。此外,还提到了`super()`函数在子类中调用父类方法的应用,以及类的`__bases__`属性用于获取父类。最后,探讨了多重继承可能导致的名称冲突问题及其解决方案。
摘要由CSDN通过智能技术生成

继承:

  • 定义一个类Animal(动物),这个类中需要两个方法:run() sleep()
class Animal:

        def run(self):

              print('动物会跑')

        def sleep(self):

              print('动物睡觉')

  • 定义一个类Dog(狗)
class Dog:

       def run(self):

               print('狗会跑')

       def sleep(self):

               print('狗睡觉')

       def bark(self):

               print('汪汪汪')

这个类中需要三个方法:run() sleep() bark()

能够实现我们需要的大部分的功能,但是不能实现全部功能,如何能让这个类来实现全部的功能呢?

  1. 直接修改这个类,在这个类中添加我们需要的功能。修改起来会比较麻烦,并且会违反ocp原则

  2. 直接创建一个新的类。创建一个新的类比较麻烦,并且需要大量的复制粘贴,会出现大量的重复性代码。

  3. 直接从Animal类中来继承它的属性和方法。继承是面向对象三大特性之一。通过继承我们可以使一个类获取到其他类中的属性和方法。在定义类时,可以在类名后的括号中指定当前类的父类(超类,基类,super)

class Dog(Animal):

         def bark(self):

              print('汪汪汪')

默认父类为object

class Person(object):

        pass

issubclass()检查一个类是否另一个类的子类

isinstance()用来检查一个对象是否是一个类的实例,如果这个类是这个对象的父类,也会返回True,所有的对象都是object的实例

完整例子

class Animal:
     def run(self):
         print('动物会跑')
     def sleep(self):
         print('动物会睡觉')
         
class Dog(Animal):
     def bark(self):
         print('汪汪汪...')
         
d = Dog()
d.run()
动物会跑
d.sleep()
动物会睡觉
d.bark()
汪汪汪...
isinstance(d,D)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'D' is not defined
isinstance(d,Dog)
True
isinstance(d,Animal)
True
issubclass(Animal,object)
True
issubclass(Dog,object)
True

方法重写:

定义:

  • 如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类方法而不是父类方法,这个特点我们称为方法的重写(覆盖,override).

当我们调用一个对象的方法时:
会优先去当前对象中寻找是否具有该方法,如果有则直接调用;如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法;如果没有,则去父类中的父类去寻找,以此类推,直到找到object,如果依然没有找到,则报错。

完整例子

#依次从近到远查找函数
class A(object):
     def test(self):
         print('aaa')
 class B(A):
     pass
 class C(B):
     pass
 
c = C()
c.test()
aaa

#找到父类中的函数
class A(object):
     def test(self):
         print('aaa')
 class B(A):
     def test(self):
         print('bbb')
 class C(B):
     pass
 
c = C()
c.test()
bbb

#调用当前对象中的函数
class A(object):
     def test(self):
         print('aaa')
 class B(A):
     def test(self):
         print('bbb')
 class C(B):
     def test(self):
         print('ccc')
         
c = C()
c.test()
ccc

super()

在子类中调用父类对象

class Animal():
     def __init__(self,name):
         self._name = name
     def sleep(self):
         print('动物睡觉')
     @property
     def name(self):
         return self._name
     @name.setter
     def name(self,name):
         self._name = name
         
#父类中所有的方法都会被子类继承,包括特殊方法,也可以重写特殊方法    
class Dog(Animal):
     def __init__(self,name,age):
         #希望可以直接调用父类的__init__来初始化父类中定义的属性
         #super()可以用来获取当前的父类
         #并且通过super()返回对象调用父类方法时,不需要传递self
         super().__init__(name)
         self._age = age
     def bark(self):
         print('汪汪汪')
     def run(self):
         print('狗跑...')
     @property
     def age(self):
         return self._age
     @age.setter
     def age(self,age):
         self._age = age
         
d = Dog('小黑',2)
d.name
'小黑'
d.age
2

多重继承

定义

在python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类,可以在类名中的()后边添加多个类,来实现多重继承,多重继承,会使子类同时用由多个父类,并且会获取到所有父类中的方法,在开发中没有特殊的情况,应该尽量避免使用多种继承,因为多重继承会让我们的代码过于复杂,如果多个父类中有同名的方法,则会在第一个父类中寻找,父类的父类,然后第二个父类,父类的父类,然后第三个父类,前边父类的方法会覆盖后面的父类方法。

  • 类命.__bases__这个属性可以用来获取当前类的所有父类。

完整例子

class A(object):
     def test(self):
         print('AAA')
class B(object):
     def test2(self):
         print('BBB')
 class C(A,B):
    pass
 
print(C.__base__)
<class '__main__.A'>
print(C.__bases__)
(<class '__main__.A'>, <class '__main__.B'>)
print(B.__bases__)
(<class 'object'>,)
c.test()
ccc
c = C()
c.test()
AAA
c.test2()
BBB
class A(object):
     def test(self):
         print('AAA')
class B(object):
     def test(self):
         print('BBB')
class C(A,B):
     pass
 
c = C()
c.test()
AAA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼儿LY

一切随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值