python中继承和组合的区别_python 面向对象基础梳理三 继承、派生与组合

什么是继承

继承是一种创建新类的方式,是一种什么是什么的关系,继承的功能之一就是解决代码重用的问题,继承是一种创建新类的方式,在python 中,新建的一个类可以继承一个或者多个父类,父类由可以成为基类或者超类,新建的类称为派生类或子类。

继承的分类

继承可以分为 单继承和多继承,Python 2 和 python 3 中有经典类和新式类的区分,这里描述的是python3

示例演示

#输入

classPare1class:pass

classPare2class:pass

classChildclass(Pare1class):pass

classChildclass2(Pare1class, Pare2class):print(Childclass.__bases__)print(Childclass2.__bases__)#输出

(,)

(, )

如果没有指定基类,python 会默认继承 object 类,object 是所有Python 类的基类

#输入

print(Pare1class.__bases__)print(Pare2class.__bases__)#输出

(,)

(,)

继承与重用

在python 中编写类的过程中,我们编写了一个 类 A , 想要在编写一个类B ,但类B 的大部分功能与 A类似,就用到了继承了,通过继承,B 类就会继承 A类,实现A 类的功能

继承示列演示,定义一个动物类 Animal,然后在定义两个类Dog  和 Cat  Dog 和Cat 继承Animal 的所有特征

classAnimal:def __init__(self, name, aggressive, life_value):

self.name=name

self.aggressive=aggressive

self.life_value=life_valuedefeat(self):print("%s is eating" %self.name)defsleep(self):print("%s is sleeping" %self.name)defattack(self, enemy):

enemy.life_value-=self.aggressiveclassDog(Animal):pass

classCat(Animal):passd1= Dog('snooppy', 40, 100)

c1= Cat('kitty', 30, 100)print(d1.life_value) #100

c1.attack(d1) #c1 调用 attack

print(d1.life_value) #70

#输出

70

派生

当然子类也可以添加新的属性或者在重新定义属性,一旦子类重新定义了自己的属性且与父类重名,那么就以子类的为准了

示列演示

classAnimal:def __init__(self, name, aggressive, life_value):

self.name=name

self.aggressive=aggressive

self.life_value=life_valuedefeat(self):print("%s is eating" %self.name)defsleep(self):print("%s is sleeping" %self.name)defattack(self, enemy):

enemy.life_value-=self.aggressiveclassDog(Animal):defsleep(self):print("%s is tired its needs sleep" %self.name)

d2 = Dog('dog2', 20, 100)

d2.sleep()

# 输出如下

dog2 is tired its needs sleep

Dog 类继承了 Animal,并且重新定义了自己的sleep 方法,在调用sleep 的方法使用的是自身的sleep 方法。并不影响父类

在子类中派生出的新方法中,有时需要使用父类的方法,通常有以下两种方式实现

方法1、使用父类名.父类方法

classCar:def __init__(self, name, speed, price):

self.name=name

self.speed=speed

self.price=pricedefrun(self):print("%s is running" %self.name)classBenz(Car):def __init__(self, name, speed, price, color):

Car.__init__(self, name, speed, price)

self.color=colordefrun(self):print("%s price is %s color is %s" %(self.name, self.price, self.color))

Car.run(self)

b1= Benz('benchi','120km/h','30w','white')

b1.run()#输出

benchi price is 30w color iswhite

benchiis running

定义了一个 Car 类,benz 类继承了Car 类,在执行 __init__ 函数的同时,重用了父类的init 函数,并添加了新的color 属性,并重新定义了新方法run

方法2:  使用super() 方法

示列如下:

classBenz(Car):def __init__(self, name, speed, price, color):

super().__init__(name, speed, price)

self.color=colordefrun(self):print("%s price is %s color is %s" %(self.name, self.price, self.color))

Car.run(self)

b2= Benz('benchi', '130km/h', '40w', 'black')

b2.run()#输出如下

benchi priceis 40w color isblack

benchiis running

# 使用了supper 方法 ,继承了父类

# 两种方式发的区别 方式一、跟继承没有关系,方式2 supper 依赖于继承

组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合,继承表达的是什么是什么 比如 狗是动物 苹果是水果。组合表达的是什么有什么

比如老师有课程,教授有学生

示列演示

classPeople:def __init__(self, name, age):

self.name=name

self.age=ageclassCourse:def __init__(self, name, price):

self.name=name

self.price=pricedeftell_info(self):print("%s %s" %(self.name, self.price))classTeacher(People):def __init__(self, name, age, sex, job_title):

super().__init__(name, age)

self.sex=sex

self.job_title=job_title

self.course=[]

self.students=[]classStudent(People):def __init__(self, name, age, sex):

super().__init__(name, age)

self.sex=sex

self.course=[]#实例化教师和学生

jerry = Teacher('jerry', 34, 'male', '教授')

s1= Student('s1', 23, 'male')#为教师 和学生添加课程

jerry.course.append(python)

jerry.course.append(linux)

s1.course.append(python)#为教师添加学生

jerry.students.append(s1)

# 使用

for obj in jerry.course: # jerry.course 是通过为教师添加同一个课程属性

obj.tell_info() # 调用课程属性的 tell_info 方法打印课程信息

# 输出

python 3000.0

php 5000.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值