博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 面向对象基础梳理三 继承、派生与组合
阅读量:4538 次
发布时间:2019-06-08

本文共 4243 字,大约阅读时间需要 14 分钟。

什么是继承

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

继承的分类

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

示例演示 

# 输入class Pare1class:    passclass Pare2class:    passclass Childclass(Pare1class):    passclass Childclass2(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 的所有特征

class Animal:    def __init__(self, name, aggressive, life_value):        self.name = name        self.aggressive = aggressive        self.life_value = life_value    def eat(self):        print("%s is eating" % self.name)    def sleep(self):        print("%s is sleeping" % self.name)    def attack(self, enemy):        enemy.life_value -= self.aggressiveclass Dog(Animal):    passclass Cat(Animal):    passd1 = Dog('snooppy', 40, 100)c1 = Cat('kitty', 30, 100)print(d1.life_value) # 100c1.attack(d1)  # c1 调用 attackprint(d1.life_value) # 70 # 输出70

 派生

当然子类也可以添加新的属性或者在重新定义属性,一旦子类重新定义了自己的属性且与父类重名,那么就以子类的为准了 示列演示
class Animal:    def __init__(self, name, aggressive, life_value):        self.name = name        self.aggressive = aggressive        self.life_value = life_value    def eat(self):        print("%s is eating" % self.name)    def sleep(self):        print("%s is sleeping" % self.name)    def attack(self, enemy):        enemy.life_value -= self.aggressiveclass Dog(Animal):    def sleep(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、使用父类名.父类方法
class Car:    def __init__(self, name, speed, price):        self.name = name        self.speed = speed        self.price = price    def run(self):        print("%s is running" % self.name)class Benz(Car):    def __init__(self, name, speed, price, color):        Car.__init__(self, name, speed, price)        self.color = color    def run(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 is whitebenchi is running

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

方法2:  使用super() 方法

示列如下:

class Benz(Car):    def __init__(self, name, speed, price, color):        super().__init__(name, speed, price)        self.color = color    def run(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 price is 40w color is blackbenchi is running
# 使用了supper 方法 ,继承了父类 # 两种方式发的区别 方式一、跟继承没有关系,方式2 supper 依赖于继承 组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合,继承表达的是什么是什么 比如 狗是动物 苹果是水果。组合表达的是什么有什么 比如老师有课程,教授有学生 示列演示
class People:    def __init__(self, name, age):        self.name = name        self.age = ageclass Course:    def __init__(self, name, price):        self.name = name        self.price = price    def tell_info(self):        print("%s %s" % (self.name, self.price))class Teacher(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 = []class Student(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
 

 

转载于:https://www.cnblogs.com/brave1/p/10205441.html

你可能感兴趣的文章
Recipe 1.9. Processing a String One Word at a Time
查看>>
Linux 下查看系统是32位 还是64 位的方法
查看>>
MySQL 引擎 和 InnoDB并发控制 简介
查看>>
Dave Python 练习二
查看>>
第二章 第五节 获取帮助
查看>>
关于源代码及其管理工具的总结
查看>>
此文对你人生会有莫大好处的,建议永久保存 2013-07-26 11:04 476人阅读 评论(0) ...
查看>>
JQuery怎样返回前一页
查看>>
Best Time to Buy and Sell Stock
查看>>
Web服务器的原理
查看>>
记录ok6410 jlink 命令行调试uboot
查看>>
ASP.net 内置对象
查看>>
QT使用mysql
查看>>
判断有无网
查看>>
php开发环境搭建
查看>>
HTML5表单那些事
查看>>
Spring MVC 学习总结(五)——校验与文件上传
查看>>
Spring 4 官方文档学习 Spring与Java EE技术的集成
查看>>
cocos+kbe问题记录
查看>>
自动化测试框架selenium+java+TestNG——配置篇
查看>>