蒙珣的博客

未来很长,当有勇气面对,当与自己和解。

0%

简单工厂设计模式

内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例

角色:

  • 抽象工厂角色(Creator)
  • 具体工厂角色(Concrete Creator)
  • 具体产品角色(Concrete Product)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from abc import ABCMeta, abstractmethod

class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass

class Alipay(Payment):
def __init__(self, use_huabei=False):
self.use_huabei = use_huabei

def pay(self, money):
if self.use_huabei:
print("花呗支付%d元" % money)
else:
print("支付宝支付%d元" % money)

class WechatPay(Payment):
def pay(self, money):
print("微信支付%d元" % money)

class BankPay(Payment):
def pay(self, money):
print("银行卡支付%d元" % money)

class PaymentFactory:
def create_payment(self, method):
if method == 'alipay':
return Alipay(use_huabei=True)
elif method == 'wechat':
return WechatPay()
elif method == 'bankpay':
return BankPay()
else:
raise TypeError("No such payment named %s" % method)

pf = PaymentFactory()
p = pf.create_payment('alipay')
p.pay(100)
Read more »

在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行。

魔术方法在类或对象的某些事件出发后会自动执行,让类具有神奇的“魔力”。如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写。

Python中常用的运算符、for循环、以及类操作等都是运行在魔术方法之上的。

__doc__

  • 表示类的描述信息
1
2
3
4
5
6
class Foo:
"""描述类信息,这个是工具类"""
def func(self):
pass

print(Foo.__doc__) # 输出:类的描述信息
Read more »

类对象与实例对象

他们在定义和使用中有所区别,而本质的区别是内存中保存的位置不同

  • 实例属性属于实例对象
  • 类属性属于类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Province:
# 类属性
country = "中国"

def __init__(self, name):
# 实例属性
self.name = name

# 创建一个实例对象
obj = Province("山东省")
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country

由上述代码可以看出【实例属性需要通过对象来访问】【类属性通过类访问】,在使用上可以看出实例属性和类属性的归属是不同的

Read more »

Python的引用计数

首先我们要知道,Python 内不可变对象的内存管理方式是引用计数。因此,我们在谈论浅拷贝时,其实谈论的主要特点都是基于可变对象的。

1
2
3
4
5
6
7
8
9
10
11
import copy

a = 'hello' # python的不可变对象:元组,数值,字符串
b = a
c = copy.copy(a)
d = copy.deepcopy(c)

print(id(a))
print(id(b))
print(id(c))
print(id(d))
Read more »

Logging库日志级别

级别 级别数值 使用时机
DEBUG 10 详细信息,常用于调试
INFO 20 程序正常运行过程中产生的一些信息
WARNNING 30 警告用户,虽然程序还在正常工作,但有可能发生错误
ERROR 40 由于更严重的问题,程序已不能执行一些功能了
CRITICAL 50 严重错误,程序已不能继续运行

默认的日志级别是warning

Read more »

Python并发编程简介

因为CPU和IO是可以同时并行执行的,IO的执行,比如读取内存、磁盘、网络他的过程中是不需要CPU的参与的。这样的话使用多线程CPU可以释放出来,来执行其他Task,实现并发加速

同理加入多进程就可以同时使用多个CPU来执行多个Task,来为我们的程序提速

Read more »

Allure报告结构

  • Overview:整体数据显示。

  • Suites:用例集合,按照套件和类分组的已执行测试的标准结构表示形式。

  • Behaviors:对于行为驱动的方法,此选项卡根据Epic、Feature和Story标记对测试结果进行分组。

  • Categories:“类别”选项卡提供了创建自定义缺陷分类以应用测试结果的方法。

  • Graphs:用图表显示测试数据中收集的不同统计数据,状态分解或严重性和持续时间图。

  • Packages:软件包选项卡表示测试结果的树状布局,按不同的包名分组。

  • Timeline:时间轴选项卡可视化测试执行的回顾,allure适配器收集测试的精确时间,在这个选项卡上,它们相应地按照顺序或并行的时间结构排列。

Read more »

  • functools.wraps
  • functools.lru_cache(待补充)
  • functools.total_ordering(待补充)
  • functools.total_ordering(待补充)
  • functools.singledispatch(待补充)
  • functools.partial(待补充)
  • functools.partialmethod(待补充)
  • functools.reduce(待补充)

functools.wraps

functools.wraps 是一个 Python 的装饰器工厂函数,用于更新一个函数对象,将另一个函数对象的元信息(如名称、文档字符串、注解和模块)复制到它上面。这通常用于创建装饰器,以确保被装饰的函数在装饰之后仍然保持其原始的元信息。

当你创建一个装饰器时,你通常会定义一个接受函数作为参数的函数,并返回一个新的函数对象。这会导致原始函数的元信息(如函数名)丢失,因为返回的是一个全新的函数对象。使用 functools.wraps 可以帮助解决这个问题。

Read more »

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写

YAML 的配置文件后缀为 .yml,如:runoob.yml

YAML基本语法

  • 大小写敏感

  • 使用缩进表示层级关系

  • 缩进不允许使用tab,只允许空格

  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

  • ‘#’表示注释

Read more »