python3 类的继承

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类

pass

查看继承

SubClass1.bases #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类

(<class ‘main.ParentClass1’>,)

SubClass2.bases

(<class ‘main.ParentClass1’>, <class ‘main.ParentClass2’>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

ParentClass1.bases

(<class ‘object’>,)

ParentClass2.bases

(<class ‘object’>,)

3.继承与抽象(先抽象再继承)

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

  • 将奥巴马和梅西这俩对象比较像的部分抽取成类;

  • 将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

在这里插入图片描述

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

在这里插入图片描述

4.继承与重用性

第一部分

例如

猫可以:喵喵叫、吃、喝、拉、撒

狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,伪代码如下:

#猫和狗有大量相同的内容

class 猫:

def 喵喵叫(self):

print ‘喵喵叫’

def 吃(self):

do something

def 喝(self):

do something

def 拉(self):

do something

def 撒(self):

do something

class 狗:

def 汪汪叫(self):

print ‘汪汪叫’

def 吃(self):

do something

def 喝(self):

do something

def 拉(self):

do something

def 撒(self):

do something

第二部分

上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:

动物:吃、喝、拉、撒

猫:喵喵叫(猫继承动物的功能)

狗:汪汪叫(狗继承动物的功能)

伪代码如下:

class 动物:

def 吃(self):

do something

def 喝(self):

do something

def 拉(self):

do something

def 撒(self):

do something

在类后面括号中写入另外一个类名,表示当前类继承另外一个类

class 猫(动物):

def 喵喵叫(self):

print ‘喵喵叫’

在类后面括号中写入另外一个类名,表示当前类继承另外一个类

class 狗(动物):

def 汪汪叫(self):

print ‘汪汪叫’

第三部分

#继承的代码实现

class Animal:

def eat(self):

print("%s 吃 " %self.name)

def drink(self):

print ("%s 喝 " %self.name)

def shit(self):

print ("%s 拉 " %self.name)

def pee(self):

print ("%s 撒 " %self.name)

class Cat(Animal):

def init(self, name):

self.name = name

self.breed = ‘猫’

def cry(self):

print(‘喵喵叫’)

class Dog(Animal):

def init(self, name):

self.name = name

self.breed=‘狗’

def cry(self):

print(‘汪汪叫’)

######### 执行

c1 = Cat(‘小白家的小黑猫’)

c1.eat()

c2 = Cat(‘小黑的小白猫’)

c2.drink()

d1 = Dog(‘胖子家的小瘦狗’)

d1.eat()

使用继承来重用代码比较好的例子

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

class Animal:

‘’’

人和狗都是动物,所以创造一个Animal基类

‘’’

def init(self, name, aggressivity, life_value):

self.name = name # 人和狗都有自己的昵称;

self.aggressivity = aggressivity # 人和狗都有自己的攻击力;

self.life_value = life_value # 人和狗都有自己的生命值;

def eat(self):

print(‘%s is eating’%self.name)

class Dog(Animal):

pass

class Person(Animal):

pass

egg = Person(‘egon’,10,1000)

ha2 = Dog(‘二愣子’,50,1000)

egg.eat()

ha2.eat()

提示:用已经有的类建立一个新的类,这样就重用了已经有的软件中的一部分设置大部分,大大生了编程工作量,这就是常说的软件重用,不仅可以重用自己的类,也可以继承别人的,比如标准库,来定制新的数据类型,这样就是大大缩短了软件开发周期,对大型软件开发来说,意义重大。

5.类的派生

当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

class Animal:

‘’’

人和狗都是动物,所以创造一个Animal基类

‘’’

def init(self, name, aggressivity, life_value):

self.name = name # 人和狗都有自己的昵称;

self.aggressivity = aggressivity # 人和狗都有自己的攻击力;

self.life_value = life_value # 人和狗都有自己的生命值;

def eat(self):

print(‘%s is eating’%self.name)

class Dog(Animal):

‘’’

狗类,继承Animal类

‘’’

def bite(self, people):

‘’’

派生:狗有咬人的技能

:param people:

‘’’

people.life_value -= self.aggressivity

class Person(Animal):

‘’’

人类,继承Animal

‘’’

def attack(self, dog):

‘’’

派生:人有攻击的技能

:param dog:

‘’’

dog.life_value -= self.aggressivity

egg = Person(‘egon’,10,1000)

ha2 = Dog(‘二愣子’,50,1000)

print(ha2.life_value)

print(egg.attack(ha2))

print(ha2.life_value)

注意:像ha2.life_value之类的属性引用,会先从实例中找life_value然后去类中找,然后再去父类中找…直到最顶级的父类。

在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值.

在python3中,子类执行父类的方法也可以直接用super方法.

(1)supper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值