目录
继承和派生
组合
抽象类
继承和派生
继承是一种在已有类的基础上创建新类的过程。通过继承创建的新类称为子类或派生类,被继承的类称为父类、基类或超类。
子类会继承父类的属性和方法,当我们定义了一个类A,然后又想定义一个类B,但类B的大部分内容都与类A相同,这时候我们就可以让类B继承类A,从而避免重写类B和类A相同的那部分内容。所以说,继承其实是实现代码重用的一种方式。
Python中的继承有单继承和多继承两种方式,单继承是指子类继承自一个父类,如下面的类 SonClass1;多继承是指子类同时继承自两个或两个以上的父类,如下面的类 SonClass2。
class ParentClass1:
def p1(self):
print('parent one')
class ParentClass2:
def p2(self):
print('parent two')
class SonClass1(ParentClass1):
def son_one(self):
print('son one')
class SonClass2(ParentClass1, ParentClass2):
def son_two(self):
print('son two')
print('mro列表:', SonClass1.mro())
print('第一个父类:', SonClass1.__base__) # 定义该类时,括号内从左至右的第一个父类
print('父类列表:', SonClass1.__bases__) # 即定义该类时,括号内的所有父类
print('*'*50)
print('mro列表:', SonClass2.mro())
print('第一个父类:', SonClass2.__base__)
print('父类列表:', SonClass2.__bases__)
'''
mro列表: [<class '__main__.SonClass1'>, <class '__main__.ParentClass1'>, <class 'object'>]
第一个父类: <class '__main__.ParentClass1'>
父类列表: (<class '__main__.ParentClass1'>,)
**************************************************
mro列表: [<class '__main__.SonClass2'>, <class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>, <class 'object'>]
第一个父类: <class '__main__.ParentClass1'>
父类列表: (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
'''
PS:在Python中,所有的类都默认继承自一个叫 object 的类,object类中定义了一些基本的方法,如__str__等。
对象和类与子类和父类在某种程度上是很相似的
'''
对象:我是通过类的实例化创建的
子类:我是通过对父类的继承创建的
对象:在代码中,现有的类再有的我,但是类可以看做是对很多个我的抽象化产生的
子类:在代码中,也是现有的父类再有的我,父类也可以看做是对很多个我的抽象化产生的
对象:我可以访问类的属性和方法
子类:我也可以访问父类的属性和方法
对象:我可以创建自己特有的属性,如果我的属性与类的属性重名,那么会优先访问我自己的属性
子类:我也可以创建自己特有的属性,如果我的属性与父类的属性重名,那么也会优先访问我自己的属性
'''
图示
派生
派生的字面意思是指从一个主要事物的发展中分化出来。而这种分化往往伴随着变化。
类的派生可以看做在原来类的基础上增删改了某些属性或方法。比如使类A在继承类B的基础上创建自己的方法,那么此时就可
以说A是B的派生类。
通过继承所创建的类都可称为派生类(因为如果毫无变化,那继承就没有意义)。
组合
组合的概念很简单,即在一个类中以另外一个类的对象作为数据属性。它与继承一样,也是实现代码重用的一种方式。
class A:
pass
class B:
sample = A()
#在类B中以类A的对象作为数据属性
PS:继承和组合都是代码重用的重要方式,但两者的概念和使用场景都不同。继承建立的是子类和父类的关系,这是一种‘是’的关系,比如猫是动物;组合建立的则是类和类之间‘有’的关系,比如关羽有赤兔马。
抽象类
简单来说,抽象类就是一种含有抽象方法(没有具体实现的方法)的类。抽象类的实现需要用到abc模块,所以抽象类有时也称为ABC类。
抽象类可以没有属性,也可以没有具体的方法,但它至少要含有一个抽象方法。
与其他类相比,抽象类具有只能被继承的特点;无论是抽象类,还是它的子类,只要含有一个抽象方法,那么这个类就不能被实例化
import abc
class Animal(metaclass=abc.ABCMeta):
name = None
@abc.abstractmethod
def manger(self):
pass
@abc.abstractmethod
def boire(self):
pass
class Cat(Animal):
def manger(self):
print('吃吃')
def boire(self):
print('喝喝')
# class Dog(Animal):
# def manger(self):
# # 只实现一个抽象方法
# print('吃吃')
# dog = Dog() # Can't instantiate abstract class Dog with abstract methods boire
cat = Cat()
cat.manger()
# 吃吃
PS:抽象类的作用是设定类的标准,规范其子类的行为和接口(必须实现其所有抽象方法才能被实例化)。