Python--面向对象特征2一继承

一、继承简介

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

①直接修改这个类,在这个类中添加我们需要的功能;

但是修改起来比较麻烦,会违反ocp原则

②直接创建一个新的类

但是创建一个新的比较麻烦,需要大量的复制粘贴,会出现大量的重复性代码

③直接从animal类中继承它的属性和方法

2.什么是继承?

--继承是面向对象的三大特性之一

--通过继承我们可以使一个类获取到其它类中的属性和方法

--在定义类的时候,可在类名后的括号中指定当前类的父类(超类、基类、super)

 子类(衍生类)可以直接继承父类中的所有属性和方法。

通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合ocp原则,所以我们经常需要通过继承来对一个类进行扩展。

注意:在创建类的时候,如果省略了父类,则默认父类为object。所有的类都是object的子类。

#继承

#定义一个Animal的类

#这个类中2个方法

class Animal:

def run(self):

print('动物会跑~~~~ ')

def sleep(self):

print('动物睡觉~~~~')

#定义一个Dog类

class Dog(Animal):

def bark(self):

print('汪汪汪---')

#d既是dog的实例也是animal的实例

d = Dog()

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

print(issubclass(Dog,Animal))

#isinstance()用来检查一个对象是否是一个类的实例

#如果这个类是这个对象的父类,也会返回True

#所有的类都是object的子类

print(isinstance(Animal,object))

图示

二、方法的重写

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

class Animal:

def run(self):

print('动物会跑~~~~ ')

def sleep(self):

print('动物睡觉~~~~')

#定义一个Dog类

class Dog(Animal):

def bark(self):

print('汪汪汪---')

def run(self):

print('狗狗会跑@@@@')

#创建dog类的实例

d=Dog()

d.run()

图示

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

三、super

父类中的所有方法都会被子类继承,包括特殊方法,也可以重写特殊方法。

class Animal:

#特殊方法init

    def __init__(self,name):

self.__name = name

#设置name的getter和setter方法

        @property

        def name(self):

return self.__name

@name.setter

        def name(self,name):

self.__name = name

def run(self):

print('动物会跑~~~~ ')

def sleep(self):

print('动物睡觉~~~~')

#定义一个Dog类

class Dog(Animal):

#重写特殊方法init

    def __init__(self,name,age):

self.__name = name

self.__age = age

#设置age的getter和setter方法,name已经在父类中设置过了

    @property

    def age(self):

return self.__age

@age.setter

    def age(self):

self.__age = age

def bark(self):

print('汪汪汪---')

def run(self):

print('狗狗会跑@@@@')

#创建dog类的实例

d=Dog('常狗',26)

d.name ='小黑'

print(d.name)

print(d.age)


图示

虽然子类可以重写父类的特殊方法,但是将父类的全部方法写入,会有些麻烦。

super()可以用来获取当前类的父类,并且通过super()返回对象调用父类方法时候,不需要传递self。

图示

四、多重继承

__类名.__bases这个属性可以用来获取当前类的所有父类

class A(object):

def test(self):

print('AAAAA')

class B(A):

def test(self):

print('BBBBB')

class C(B):

def test(self):

pass

print(C.__base__)#输出(<class '__main__.B'>,)

在python中支持多重继承的,也就是一个类可以同时指定多个父类

--可在类名的()后边添加多个类,来实现多重继承

--多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法

注意:在开发中没有特殊情况,应该避免多重继承,因为多重继承会让我们的代码过于复杂。如果多个父类中有同名的方法,则会先在第一个父类中去寻找,然后找第二个第三个。前边的会覆盖后面的。

class A(object):

def test(self):

print('AAAAA')

class B(object):

def test2(self):

print('BBBBB')

class C(A,B):

pass

print(C.__base__)#输出(,)

c = C()

c.test()

c.test2()

图示

推荐阅读更多精彩内容

  • 一、面向对象三大特性 封装:根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中继承:实现代码的重用,相同的...
    IIronMan阅读 697评论 0 7
  • 一、面向对象三大特性 封装:根据职责将属性和方法封装 到一个抽象的类中 继承:实现代码的重用,相同的代码不需要重复...
    有怪兽103阅读 200评论 0 0
  • 今日内容 面向对象的三大特性 封装 继承与派生 多态与多态性 绑定方法与非绑定方法 内置的方法 元类 异常处理 内...
    徐弱西阅读 29评论 0 0
  • 抽象类 什么是抽象类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的...
    go以恒阅读 240评论 0 3
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 4,892评论 0 6