Python设计小技巧

1、类与约束,抽象类设计

(1)第一种,约束不严格,只有调用到未实现方法时才会报异常

class Payment(object):
    def pay(self):
        raise NotImplementedError("%s未实现pay方法" % self.__class__.__name__)


class WechatPay(Payment):
    def pay(self):
        print("微信支付")

(2)第二种,python3引入abc模块,实现了严格约束

import abc

class Payment(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def pay(self):
        pass


class WechatPay(Payment):
    def pay(self):
        print("微信支付")

2、单例模式

(1)利用python天然的特性

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

在其他文件中调用 from . import singleton 就行了

(2)利用__new__()创建对象只调用一次的特性

import threading


class Singleton(object):

    __instance = None
    __lock = threading.RLock()

    def __init__(self):
        pass
        # print("调用 __init__")

    def __new__(cls, *args, **kwargs):
        if cls.__instance:
            return cls.__instance
        with cls.__lock:
            if not cls.__instance:
                # 创建对象
                cls.__instance = super().__new__(cls, *args, **kwargs)
            return cls.__instance

    def func(self):
        print("调用 __func__")


def task():
    a = Singleton()
    print(a)


if __name__ == '__main__':

    for i in range(100):
        t = threading.Thread(target=task)
        t.start()

(3)装饰器+闭包实现单例模式

装饰器的本质就是闭包函数

"""
闭包:1.函数嵌套
      2.内部函数使用外部函数变量
      3.外部函数返回内部函数
作用:
    闭包可以保存外部函数的变量,不会随着外部函数调用完就销毁
"""
# 做累加
def add(a):
    def inner(b):
        # nonlocal a  # 告诉解释器使用的是外部变量(但是如果修改外部变量的值,就不算是闭包了)
        # a = a + b
        # return a
        return a + b
    return inner


if __name__ == '__main__':

    # for i in range(100):
    #     t = threading.Thread(target=task)
    #     t.start()
    #     # task()
    sum = add(1)
    for i in range(10):
        print(sum(i))
def singleton(cls, *args, **kwargs):
    __instance = {}

    def __singleton(*args, **kargs):
        if cls not in __instance:
            __instance[cls] = cls(*args, **kargs)
        return __instance[cls]
    return __singleton


@singleton
class A():
    i = 1
    def func(self):
        self.i += 1
        print(self.i)


def task():
    # a = Singleton()
    a = A()
    print(a)


if __name__ == '__main__':

    for i in range(100):
        t = threading.Thread(target=task)
        t.start()

3、工厂模式

(1)利用反射

先声明两个类

class Tiger(object):
    def info(self):
        return "森林之王"
class Lion(object):
    def info(self):
        return "草原之王"

然后写一个settings.py的配置类,类似于Django的配置文件原理

# 对应的动物类的 package 全路径
INFO_CLASS_DICT = {
    "lion": "animal.info.lion.Lion",
    "tiger": "animal.info.tiger.Tiger"
}

最后实现工厂方法

import importlib
import settings


def factory():
    for key, path in settings.INFO_CLASS_DICT.items():
        module_path, class_name = path.rsplit(".", 1)
        module = importlib.import_module(module_path)
        cls = getattr(module, class_name)
        animal_object = cls()
        info = animal_object.info()
        print(key, info)


if __name__ == '__main__':
    factory()

(2)其他工厂模式

工厂方法或者抽象工厂也是可实现,但第一种实现可以更好的配合实现多态或者配合抽象类使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值