面向对象编程组合用法及其继承特性


前言

大家好,我们上次学习了面向对象编程中类的创建,我们知道如何去创建一个类,并且能够调用类中的方法.查看类中的属性,今天我们就增加一些难度学习面向对象编程的组合用法.并且学习面向对象编程三特性之一的—>继承

一、面向对象编程组合用法

首先,我们要想在面向对象编程的代码中实现重复利用,我们就要用到组合用法

我们先来看一个示例:

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来查看
#查看类中方法需要先实例化,再进行调用

运行结果:

零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性-LMLPHP

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)

运行结果:
零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性-LMLPHP

当类和类之间有显著的不同,并且较小的类是较大的类所需要的组建时,可以用组合的用法实现代码的重复利用.


二、面向对象编程----继承

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.抽象和继承关系

抽象

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

用已经有的类创建一个新的类,这样就重用了已经有的代码中的一部分.

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()

运行结果:
零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性-LMLPHP

在这里面我们使用子类重新写了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()

运行结果:
零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性-LMLPHP

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()

运行结果:
零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性-LMLPHP

子类继承父类之后重写__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.多个父类则根据列表中的顺序被检查

总结

今天我们详细的讲解了面向对象的两种组合用法,以及面向对象三特性之一继承的重要知识点,希望大家多多练习,按照本文示例代码敲写一遍

讲的不好,多多见谅,我们下次再见!

更多优质文章点这里

02-13 14:35