面向对象编程组合用法及其继承特性
文章目录
- 面向对象编程组合用法及其继承特性
- 前言
- 一、面向对象编程组合用法
- 1 直接在类中创建实例化对象
- 2 给入参数,在结尾给一个类实例化传参变成对象,然后再在另一个类中传入对象参数
- 二、面向对象编程----继承
- 1.继承定义
- (1) 单继承
- (2)多继承
- 2.抽象和继承关系
- 3.派生(方法重写)
- 调用父类方法
- 子类继承父类之后重写__init__方法
- 4.抽象类的使用
- 5.多继承的继承顺序
- 总结
前言
大家好,我们上次学习了面向对象编程中类的创建,我们知道如何去创建一个类,并且能够调用类中的方法.查看类中的属性,今天我们就增加一些难度学习面向对象编程的组合用法.并且学习面向对象编程三特性之一的—>继承
一、面向对象编程组合用法
首先,我们要想在面向对象编程的代码中实现重复利用,我们就要用到组合用法
我们先来看一个示例:
1 直接在类中创建实例化对象
#如果我们有两种类,如何实现组合调用
class Weapon:#定义一个Weapon类
def __init__(self,name):#给如参数name
self.name = name
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
# 在类的内部进行实例化得到另一个类的对象
self.weapon = Weapon('棍子') #初始化weapon属性中直接将Weapon类实例化
p = Person('张三',28)#实例化Person类
print(p.weapon.name)#调用Person类中的Weapon对象传入的'棍子',所以我们得到的结果一定是棍子,我们就在另一个类中组合运用了其他类的属性.
#查看类中属性需要用print来查看
#查看类中方法需要先实例化,再进行调用
运行结果:
2 给入参数,在结尾给一个类实例化传参变成对象,然后再在另一个类中传入对象参数
示例代码:
class Weapon:
def __init__(self,name):
self.name = name
class Person:
def __init__(self,name,age,weapon):#给如weapon参数
self.name = name
self.age = age
# 在类的内部进行实例化得到另一个类的对象
# self.weapon = Weapon('棍子') #初始化weapon属性中直接将Weapon类实例化
self.weapon = weapon #初始化weapon参数
w = Weapon('枪') #将类实例化后变成对象
p = Person('仁泽',19,w)给Person类传入参数,将Weapon实例化后的对象传入也可以实现调用
print(p.weapon.name)
运行结果:
当类和类之间有显著的不同,并且较小的类是较大的类所需要的组建时,可以用组合的用法实现代码的重复利用.
二、面向对象编程----继承
1.继承定义
在python中,可以通过继承,让一个类使用另一个类的全部属性.
继承: 新建的类可以继承一个父类或者多个父类的属性,新建的类称为子类.
父类和子类就像爸爸和儿子一样,儿子继承爸爸的全部属性
(1) 单继承
语法:
class Dad:#父类
pass
class Son1(Dad):
pass
class Son2(Dad)
pass
(2)多继承
语法:
class Dad1:#父类1
pass
class Dad2:#父类2
pass
class son(Dad1,Dad2): #子类,同时继承两个父类的所有属性
pass
2.抽象和继承关系
抽象
1.将对象比较像的部分抽取成类
2.将类比较像的部分抽取成父类
继承:是基于抽象的结果,通过编程语言去实现,先经历过抽象,才能通过继承的方式去表达抽象的结构
用已经有的类创建一个新的类,这样就重用了已经有的代码中的一部分.
3.派生(方法重写)
方法重写: 子类可以重写(覆盖)父类的方法,以改变方法的行为。
示例代码:
class Parent:
def say_hello(self):
print("Hello from Parent")
class Child(Parent):
def say_hello(self):
print("Hello from Child")
child = Child()
child.say_hello()
运行结果:
在这里面我们使用子类重新写了say_hello 的方法,对父类的方法进行了覆盖,所以结果是子类我们修改后的结果。
- 1.直接在子类中定义新的属性
- 2.在子类中,新建的重名的函数属性,那么调用新增的属性时,是以自己的为准
- 3.但是可能需要用到父类中重名的那个函数功能
调用父类方法
语法:
1 super()
class Parent:
def say_hello(self):
print("Hello from Parent")
class Child(Parent):
def say_hello(self):
super().say_hello()# super()调用父类中的say_hello方法
print("Hello from Child")
child = Child()
child.say_hello()
运行结果:
2 在子类中使用父类名.方法名(self)调用父类方法,self也需要传参
代码示例:
class Parent:
def say_hello(self):
print("Hello from Parent")
class Child(Parent):
def say_hello(self):
Parent.say_hello(self)#在子类中使用父类名.方法名(self)调用父类方法,self也需要传参
print("Hello from Child")
child = Child()
child.say_hello()
运行结果:
子类继承父类之后重写__init__方法
示例代码:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print('%s吃' % self.name)
def drink(self):
print('%s喝' % self.name)
class Cat(Animal):
def __init__(self, name, breed):#传入新的属性breed
super().__init__(name) # 执行父类Animal中的__init__方法,传入父类参数,没有self
self.breed = breed # 派生新的属性
class Parent:
def __init__(self, name):
self.name = name
class Child(Parent):
def __init__(self, name, age):#传入新的属性age
super().__init__(name) # 使用super()调用父类的初始化方法
self.age = age
def print_info(self):
print("Name:", self.name)
print("Age:", self.age)
child = Child("Alice", 10)
child.print_info()
以上就是在子类中重写__init__的方法
4.抽象类的使用
抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类提供了一种将相关的类组织在一起的机制,它定义了一个接口或者一组方法,供子类实现。抽象类一般用作父类,通过定义抽象方法来规范子类的行为,子类必须实现这些抽象方法才能被实例化。
抽象类的主要作用有以下几个方面:
提供了一种约束机制:通过定义抽象方法,抽象类可以规范子类的行为,强制子类实现一些特定的方法。这样可以确保子类具有特定的行为或功能,提高了代码的可读性和可维护性。
作为接口的替代方案:Python中没有像Java等语言中的接口概念,但通过抽象类可以模拟接口的功能。通过定义抽象方法,可以实现多态特性,让不同的子类有不同的实现方式。
提供了一种多继承的方式:Python支持多继承,一个类可以同时继承多个父类。通过继承抽象类,子类可以获得多个父类的属性和方法,实现了代码复用和多态特性。
总之,抽象类提供了一种规范和约束子类行为的机制,同时也提供了代码复用和多态的功能。在实际开发中,抽象类常常用作父类,通过继承和重写来实现具体的业务逻辑。
import abc
class File(metaclass=abc.ABCMeta):
@abc.abstractmethod # 定义抽象方法,无需实现功能
def read(self): #控制子类必须实现这个方法
print('必须实现我')
@abc.abstractmethod
def write(self):
pass
class Txt(File):
def read(self):
print('文本文件读')
def write(self):
print('文本文件写')
5.多继承的继承顺序
python会自动计算一个mro列表,里面就存放着所有父类的继承顺序.
遵循的规则:
- 1.子类先于父类被查找
- 2.如果这个类存在多个合法的选择,会从左到右选择
- 3.多个父类则根据列表中的顺序被检查
总结
今天我们详细的讲解了面向对象的两种组合用法,以及面向对象三特性之一继承的重要知识点,希望大家多多练习,按照本文示例代码敲写一遍
讲的不好,多多见谅,我们下次再见!
更多优质文章点这里