python 面向对象基础梳理三 继承、派生与组合
什么是继承
继承是一种创建新类的方式,是一种什么是什么的关系,继承的功能之一就是解决代码重用的问题,继承是一种创建新类的方式,在python 中,新建的一个类可以继承一个或者多个父类,父类由可以成为基类或者超类,新建的类称为派生类或子类。
继承的分类
继承可以分为 单继承和多继承,Python 2 和 python 3 中有经典类和新式类的区分,这里描述的是python3
示例演示
# 输入 class Pare1class: pass class Pare2class: pass class Childclass(Pare1class): pass class Childclass2(Pare1class, Pare2class): print(Childclass.__bases__) print(Childclass2.__bases__) # 输出 (<class '__main__.Pare1class'>,) (<class '__main__.Pare1class'>, <class '__main__.Pare2class'>)
如果没有指定基类,python 会默认继承 object 类,object 是所有Python 类的基类
# 输入 print(Pare1class.__bases__) print(Pare2class.__bases__) # 输出 (<class 'object'>,) (<class 'object'>,)
继承与重用
在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.aggressive class Dog(Animal): pass class Cat(Animal): pass d1 = 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
派生
当然子类也可以添加新的属性或者在重新定义属性,一旦子类重新定义了自己的属性且与父类重名,那么就以子类的为准了
示列演示
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.aggressive class 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 white benchi 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 black benchi is running
# 使用了supper 方法 ,继承了父类
# 两种方式发的区别 方式一、跟继承没有关系,方式2 supper 依赖于继承
组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合,继承表达的是什么是什么 比如 狗是动物 苹果是水果。组合表达的是什么有什么
比如老师有课程,教授有学生
示列演示
class People: def __init__(self, name, age): self.name = name self.age = age class 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

浙公网安备 33010602011771号