PYTHON ----单例模式

                                单例模式

一. 单例模式的概念及作用
1. 单例模式只创建一个对象,当多个对象被创建的时候,就会直接引用第一个对象的值
2. 创建对象时实参也会传递到 new 方法
但是一般 new 都不会使用参数,此时可以使用不定长参数来接收,
new 方法会在创建对象时,在初始化之前被调用,可以用 new 方法来判断是否已经创建了对象,来执行单例

二. _new_ 方法的使用及解读
(1)
class Person(object):

        def __new__(cls):
            """
            __new__ 当创建对象的时候会自动执行。
            如果 __new__ 没有返回值,则这个类不能创建新对象。
            如果 __new__ 想要创建新对象,则手动调用 object 来处理,并将生成的对象返回
            """
            obj = object.__new__(cls)  # 重写__new__方法之后,如果要创建新的实例对象,需要手动调用 object.__new__(cls)
            print('new---obj=', obj)
            return obj  # 创建出来的实例对象,必须使用 return 返回


        def __init__(self):
            """__init__ 在创建对象之后会自动执行"""
            print('init---self=', self)
            self.name = '张三'

    print('----1----')
    p = Person()
    print('----2----')
    print('p=', p)

(2)
class Person(object):

        # 创建对象时实参也会传递到 __new__ 方法
        # 但是一般 __new__ 都不会使用参数,此时可以使用不定长参数来接收
        def __new__(cls, *args, **kwargs):
            """当创建对象的时候会自动执行"""
            print('new---args=', args, 'kwargs=', kwargs)
            obj = object.__new__(cls)
            return obj

        def __init__(self, name, age):
            """__init__ 在创建对象之后会自动执行"""
            print('init---self=', self)
            self.name = name

    p = Person('李四', age=18)
    print('p=', p

三. 单例模式 (在类中)
class Person(object):

    instance = None  # 定义类属性来记录创建好的对象

    def __new__(cls, *args, **kwargs):
        if cls.instance == None:  # 只有当 instance 为 None 才创建新对象
            cls.instance = object.__new__(cls)
        return cls.instance

    def __init__(self, name):
        self.name = name

zs = Person('张三')
print(zs)
ls = Person('李四')
print(ls)

四. 单例模式(完善版

class Person(object):

    instance = None  # 定义类属性来记录创建好的对象
    is_first_run = True  # 如果为 True 则说明是第一次创建对象

    def __new__(cls, *args, **kwargs):
        if cls.instance == None:  # 只有当 instance 为 None 才创建新对象
            cls.instance = object.__new__(cls)
        return cls.instance

    def __init__(self, name=''):
        if Person.is_first_run:
            self.name = name  # 只有第一次创建对象才应该执行赋值
            Person.is_first_run = False

    def set_name(self, new_name):  # 单例如果要修改属性,可以通过方法来处理
        self.name = new_name

zs = Person('张三')
print(zs.name)
ls = Person()  # 如果不想为初始化传递参数,可以使用缺省参数
print(ls.name)
ls.set_name('李四')
print(zs.name)

五. 单例模式 (在函数装饰器中)

– 单例模式
def sing_leton(cls):
# 定义一个类的字典
instances = {}

    def get_instance(*args, **kwargs):
        # 判断这个类的对象是不是在字典中

        if cls not in instances:
            # 说明不在字典中
            instances[cls] = cls(*args, **kwargs)
        # 如果不在字典中那么就是返回最早创建的对象
        return instances[cls]

    return get_instance


@sing_leton
class MyClass(object):
    a = 1

c1 = MyClass()
c2 = MyClass()

print(c1 == c2)  
print(id(c1))
print(id(c2))

"""
 结果为:
    True
    140347536038880
    140347536038880

"""

六. 静态方法与类方法

class Person(object):

    __num = 0  # _Person__num

    def __init__(self, name):
        self.name = name
        Person.__num += 1

    def drink(self):  # 方法第一个形参为实例对象的方法,是实例方法
        print('喝东西')

    @classmethod  # 装饰器,语法糖
    def get_num(cls):  # 类方法,在方法上写一个 @classmethod,方法的第一个形参必定是类对象
        # print(cls)
        return Person.__num

    @staticmethod
    def add2num(a, b):  # 静态方法。在方法上写一个 @staticmethod, 方法没有任何强制性的形参
        print(a+b)


zs = Person('张三')

print('创建的对象个数为: %d' % Person.get_num())  # 类方法调用, 类名.方法名()

Person.add2num(11,22)  # 静态方法调用,类名.方法名()

七. SUPER 与 _mro_ 的使用
1. super() 主要的作用是为了解决我们的父类被多次重复初始化的问题
2. super() 调用是 mro 顺序表中下一个类的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值