当前位置:首页 > 技术分析 > 正文内容

Python入门题037:实现单例类(3种方法)

题目:

实现一个单例类,至少用3种方法。

#python #设计模式 #单例类 #metaclass

视频教程:

Python入门题037:实现单例类(3种方法)

代码1:

def singleton(cls):
    instances = {}

    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return getinstance


@singleton
class MyClass(object):
    def __init__(self, name):
        self.name = name


class MyClass2(object):
    pass


a = MyClass('hello')
b = MyClass('world')

print('a.name', a.name)  # a.name hello
print('b.name', b.name)  # b.name hello
print('b is a', b is a)  # b is a True
print('type(MyClass2)', type(MyClass2))  # type(MyClass2) <class 'type'>
print('type(MyClass)', type(MyClass))  # type(MyClass) <class 'function'>

代码2:

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not isinstance(cls._instance, cls):
            cls._instance = super().__new__(cls)
        return cls._instance


class MyClass(Singleton):
    def __init__(self, name):
        self.name = name


class MyClass2(object):
    pass


a = MyClass('hello')
b = MyClass('world')  # world 会覆盖 hello

print('a.name', a.name)  # 输出 world
print('b.name', b.name)
print('type(MyClass2)', type(MyClass2))
print('type(MyClass)', type(MyClass))

代码3:

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class MyClass(metaclass=Singleton):
    def __init__(self, name):
        self.name = name


class MyClass2(object):
    pass


a = MyClass('hello')
b = MyClass('world')

print('a.name', a.name)
print('b.name', b.name)
print('type(MyClass2)', type(MyClass2))
print('type(MyClass)', type(MyClass))



扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4718.html

标签: kwargs.get
分享给朋友:

“Python入门题037:实现单例类(3种方法)” 的相关文章

vue3中父子组件之间传值的详解

首先我们回顾一下vue2中父子组件是怎么传值的,然后对比vue3进行详解。一、vue2中父子组件传值<!-- 父组件 --> <template> <div> // name:父组件把值传给子组件test-child // childFn:...

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

Excel中的FILTER函数详细介绍及使用示例

在Excel中处理大量数据时,经常需要根据特定条件筛选出符合条件的数据行或列。这正是Excel的FILTER函数发挥作用的地方。FILTER函数是Excel中一个非常强大的工具,它可以基于一个或多个条件动态地过滤数据,使数据分析和报告制作变得更加高效和准确。本文将详细介绍FILTER函数的用法,并提...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...

一起学Vue:路由(vue-router)

前言学习vue-router就要先了解路由是什么?前端路由的实现原理?vue-router如何使用?等等这些问题,就是本篇要探讨的主要问题。vue-router是什么路由是什么?大概有两种说法:从路由的用途上来解释路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同。从路由的实现原理上来解释路...

从 Vue2.0 到 React17——React 开发入门

作者:佚名来源:前端大全前言找工作时发现有一些公司是以React作为技术栈的,而且薪资待遇都不错,为了增加生存的筹码,所以还是得去学一下React,增加一项求生技能。因为我用Vue2.0开发项目已经四年了,故用Vue2.0开发项目的思路来学习React。前端项目是由一个个页面组成的,对于Vue来说,...