python——继承 简单工厂 单例模式

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

单例模式:该模式的主要目的是确保某一个类只有一个实例存在

class singleton:

    name='sing'

      借助第三方变量

    __instance=None;

    def __new__(cls, *args, **kwargs):

        if cls.__instance == None:

            cls.__instance= object.__new__(cls);

            return  cls.__instance;

        else:

            return cls.__instance;

 

    def __init__(self,score):

        self.score=score;

 

s=singleton(60);

setattr(singleton,'name','oop')

 

print(singleton.name)

 

 print(s.__getattribute__('score'))

  s.__setattr__('score2',70)

   print(s.__getattribute__('score2'))

print('getattr(s,score2)',getattr(singleton,'name'))

   print(' hasattr(s,score2)', hasattr(s,'score2'))

   print(id(s))

   s1=singleton();

   print(id(s1))

   a,b=10,5;

   c=a;

   a=b;

   b=c;

     b,a=a,b;

   print(a,b)

计算器

class Operation:

    def __new__(cls):

       pass

    def GetResult(self,numA, numB):

        print('计算2操作数的运算结果')

 

class OpeartionAdd(Operation):

 

    def __new__(cls):

        return object.__new__(cls);

        return  Operation.__new__(cls)

 

    def GetResult(self,numA,numB):

        return  numA+numB

 

class OperationSub(Operation):

    def GetResult(self,numA,numB):

        return  numA-numB

 

class OperationMul(Operation):

    def GetResult(self,numA,numB):

        return  numA*numB

class OperationDiv(Operation):

    def GetResult(self,numA,numB):

        return  numA//numB

 

class OperationFactory(object):

     不同的参数创建不同的对象的  函数

    def create_class(self,fu):

        if fu == '+':

            q = OpeartionAdd();

        elif fu == '-':

            q = OperationSub();

        elif fu == '*':

            q = OperationMul();

        elif fu == '/':

            q = OperationDiv();

        return q;

 

if __name__== '__main__':

    工厂对象

    factory=OperationFactory();

    numA=int(input('请输入第一个操作数'))

    numB=int(input('请输入第二个操作数'))

    fu = input('请输入运算符:')

     q代表 由 工厂创建出来的一个计算器

    q=factory.create_class(fu)

    print('计算结果:',q.GetResult(numA, numB))

 


 

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Python 中实现单例模式类的方法 #### 方法一:使用模块 在 Python 中,模块本身是天然的。当第一次导入某个模块时,Python 解释器会加载该模块并将其存储到内存中。后续对该模块的所有导入操作都会指向同一个对象。 以下是通过模块实现单例模式的一个简单子: ```python # my_singleton_module.py class Singleton: def foo(self): pass singleton_instance = Singleton() ``` 其他文件可以通过 `import` 来共享同一实[^1]。 ```python from my_singleton_module import singleton_instance as a from my_singleton_module import singleton_instance as b print(id(a)) print(id(b)) # 输出相同 ID 表明它们是同一个实 ``` --- #### 方法二:使用装饰器 装饰器是一种优雅的方式,可以在不改变原有类定义的情况下为其添加功能。下面是一个基于装饰器的单例模式实现: ```python def singleton_decorator(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton_decorator class MyClass: def __init__(self, value): self.value = value a = MyClass(10) b = MyClass(20) print(a is b) # True,表明两个变量引用的是同一个实 print(a.value) # 输出 10 或者 20(取决于具体实现) ``` 这种方法利用闭包保存已创建的对象实,并确保每次只返回唯一实[^3]。 --- #### 方法三:重写 `__new__` 方法 `__new__` 是负责创建新实的核心方法,在此阶段可以控制是否允许生成新的实。如果发现已有实存在,则直接返回旧实而不是新建一个。 下面是具体的代码示: ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance return cls._instances[cls] class MySingletonClass(metaclass=SingletonMeta): def __init__(self, data=None): self.data = data obj1 = MySingletonClass(data="Test Data") obj2 = MySingletonClass() print(obj1 is obj2) # True,证明两次调用得到相同的实 print(obj1.data) # Test Data,数据保持一致 ``` 这里采用了自定义元类的方式来管理所有继承此类的子类都成为形式[^4]。 --- ### 总结 以上介绍了三种主流的 Python 单例模式实现方式——分别是借助模块机制、运用装饰器以及覆盖特殊方法 `__new__` 。每种方案各有优劣之处,开发者可以根据实际需求灵活选用最合适的那一种。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值