Python设计模式
关于设计模式内容的学习
文章目录
一、设计模式之前
## 1. 对象/类 封装:区分类 继承: 多态2. 接口
本质上是抽象类。
抽象类:不能实例化的类,其中会定义一些抽象方法,继承了抽象类的其他类必须实现抽象类中的全部抽象方法,否则就也是一个抽象类(不能实例化)。
1)作用:限制一些继承接口的类的名称以及调用方式,隐藏类的内部实现
2)接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法
比如:
from abc import ABCMeta, abstractmethod
#定义抽象类,包含两个抽象方法func1和func2
class Interface(metaclass=ABCMeta):
@abstractmethod
def func1(self, arg):
pass
def func2(self, arg2):
pass
#定义继承抽象类的新的类,并给出抽象类中所有抽象方法的完整定义
class A(Interface):
def __init__(self, x, y):
self.x = x
self.y = y
def func1(self, x):
print(x)
def func2(self, y):
return y
#这样新的类就能够进行实例化
a = A(1,2)
print(a.func2(3))
a.func1(1)
提示:以下是本篇文章正文内容,下面案例可供参考
二、设计模式六大原则
1. 开闭原则
一个软件实体如:类、模块和函数,应在不修改原有代码的情况下进行扩展
2. 里氏替换原则
所有引用基类(父类)的地方必须能透明的使用其子类的对象。在能正确调用父类的情况下,也能够正确的调用该父类的其他子类
3. 依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖抽象;
抽象不应该依赖细节,细节应该依赖抽象;
针对接口编程,而不是针对实现编程
先定好接口,再进行实体模块编码
4. 接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口
对基类进行合理的划分,使得各个子类都能够只使用自身需要的接口,而不需要定义不必要的接口(接口的最小公因数划分)多接口多继承
5. 迪米特原则
一个软件实体应尽可能少的与其他实体发生相互作用,软件实体之间尽可能独立
6. 单一职责原则
多要存在多余一个导致类变更的原因,即为一个类负责一个任务
三、创建型模式
1. 简单工厂模式
一个工厂类实现多个具体产品角色的实例化:
1)不直接向客户端(上层代码)暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
2)优点:隐藏对象创建的实现细节;客户端不需要修改代码
3)缺点:违反了单一职责原则,将创建逻辑集中到一个工厂类里;当添加新产品时,需要修改工厂类代码,违反了开闭原则;
#定义基类,和公共接口名称
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
raise NotImplementedError
#基于父类,定义各个子类,完成父类中抽象方法的定义
class AliPay(Payment):
def pay(self, money):
print("支付宝支付%s元" % money)
class ApplePay(Payment):
def pay(self, money):
print("苹果支付{}元".format(money))
#创建一个新的类来进行上面各个子类的实例化
class PaymentFactory:
def creat_payment(self, methon):
if methon == "alipay":
return AliPay()
elif methon == "applepay":
return ApplePay()
else:
raise NameError(methon)
#实例化方法:
pp = PaymentFactory()
pf = pp.creat_payment("alipay")
pf.pay(100)
对应的工厂方法模式:
#创建实例化工厂的基类
class PaymentFactory2(metaclass=ABCMeta):
@abstractmethod
def creat_payment(self):
pass
#然后在这个父类工厂类的基类上,再定义各个实例化类
class AliPayFactory(PaymentFactory2):
def creat_payment(self):
return AliPay()
class ApplePayFactory(PaymentFactory2):
def creat_payment(self):
return ApplePay()
#调用方法
pp = AliPayFactory()
pf = pp.creat_payment()
pf.pay(100)
工厂方法模式:
1)使用场景:
a)需要生产多种、大量复杂对象的时候;
b)需要降低耦合度的时候;
c)系统中的产品种类经常需要进行拓展的时候;
2)优点:
a)每个具体产品都对应一个具体工厂类,不需要修改工厂类代码;
b)隐藏对象创建的实现细节;
代码如下(示例):
2.建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示。
代码如下(示例):
3.单例模式
保证一个类只有一个实例,并提供一个访问它的全局访问点
使用场景:当类只能有一个实体而且客户可以从一个众所周知的访问点访问它时
优点:对唯一实例的受控访问;单例相当于全局变量,但防止了命名空间被污染
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class MyClass(Singleton()):
def __init__(self, name=None):
if name is not None:
self.name = name
a = MyClass("a")
print(a.name)
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。