设计模式
定义
设计模式是前人为完成某个功能或需求,根据经验对实现的代码步骤和代码设计进行了总结和归纳,成为了实现某个需求的经典模式。
设计模式并不是固定的代码格式,而是一种面向对象编程的设计思想。
分类
单态设计模式
即在当前脚本中,同一个类只能创建出一个对象去使用
示例:
class Demo:
# 对象存储器,默认为None
__obj = None
def __new__(cls, *args, **kwargs):
# 在创建对象时,判断是否有对象
if not cls.__obj:
# 如果没有对象,则创建对象并保存
cls.__obj = object.__new__(cls)
# 如果已经有创建过的对象直接把存储的对象返回
return cls.__obj
a = Demo()
b = Demo()
print(a)
print(b)
输出:
可以看到虽然我们进行了两次类的实例化,得到的都是同一个对象
混合设计模式
混合设计模式主要用于在不修改类的内容的前提下,扩展类的功能。为了提高代码的重用性,使得代码结构更加简单清晰,我们一般会定义一个Mixin
类,该类有以下特点:
Mixin
必须是表示一种功能,而不是一个对象Mixin
的功能必须单一,如果有多个功能,那就定义多个Mixin
类Mixin
这个类通常不单独使用,而是混合到其它类中以增加其他类的功能Mixin
类不依赖子类的实现,即便子类没有继承这个Mixin
,子类也能正常运行,但是会缺少一些功能
示例:
# 定义交通工具类
class Vehicle:
def load_goods(self):
print('运输货物')
def carry_passengers(self):
print('搭载乘客')
# 定义飞行功能
class FlyingMixin:
def fly(self):
print('起飞')
# 定义汽车类
class Car(Vehicle):
pass
# 定义飞机
class Airplane(Vehicle, FlyingMixin):
pass
上面的例子展示了用混合设计模式拓展交通工具类的功能。你可能会问:直接定义一个飞行器类然后让飞机继承飞行器类不行吗?其实这样做的话会出现代码冗余,因为飞机也具有运输货物和搭载乘客的功能,而且可能会让后续的继承关系变的混乱
抽象类
抽象类,一般应用在程序设计中;在对功能和需求进行规划时,有一些需求和功能是明确的并且可以完成的,但是也可能会有一些需求是不明确的,或者不确定具体需要怎么实现,那么此时就可以把这个不确定怎么实现或者需要后面再去实现的方法,定义为抽象方法(只定义方法名,不写具体代码)。抽象类在使用时有以下特点:
- 抽象类不能直接实例化成为一个对象
- 抽象类中包含了抽象方法,抽象方法就是没有实现代码的方法
- 抽象类需要子类继承,并重写父类的抽象方法。才可以使用
示例:
import abc
# 如果要定义抽象类,那么这个类的 metaclass属性必须是 abc.ABCMeta
class App(metaclass=abc.ABCMeta):
# 需要抽象的方法,使用装饰器进行装饰
@abc.abstractmethod
def php_code(self):
pass
def java_code(self):
print('实现了java代码的开发')
def python_code(self):
print('实现了python代码的开发')
# 抽象类不能直接实例化对象
# obj = App()
# print(obj)
# TypeError: Can't instantiate abstract class App with abstract methods php
# 定义子类,继承抽象类,并实现抽象类中的抽象方法
class Demo(App):
def php_code(self):
print('实现了php代码的开发')
a = Demo()
a.java_code()
a.php_code()
a.python_code()
输出: