Python单例模式&魔法方法or属性

发布于:2025-07-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

1.单例模式

概念定义:

        单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只能有一个实例,并提供一个全局访问点来获取该实例。这种模式在需要控制资源访问、配置管理或协调系统操作时特别有用。

核心特点:

  1. 私有构造函数:防止外部通过new创建实例
  2. 静态私有成员变量:保存类的唯一实例
  3. 静态公有方法:提供获取实例的全局访问点,通常命名为getInstance()

实现方式:

1.实例方法:

class Person(object):
    name = '三笠'         # 类属性:类所拥有的属性
    def __init__(self):
        self.age = 18       # 实例属性:对象私有的
    def play(self):         # 实例方法
        # 在实例方法中访问类属性
        print(f'{Person.name}在玩游戏')
        print(self.age)
li = Person()
li.play()

2.静态方法:

class Person(object):
    name = '三笠'         # 类属性:类所拥有的属性
    def __init__(self):
        self.age = 18       # 实例属性:对象私有的
    @staticmethod       # 静态方法:类中的函数,形参没有限制
    def introduce():
        print(f'我是{Person.name}')   # 静态方法能够访问到类属性,但是没意义
    pass
li = Person()
li.introduce()

3.类方法:

class Person(object):
    name = '三笠'         # 类属性:类所拥有的属性
    def __init__(self):
        self.age = 18       # 实例属性:对象私有的
    @classmethod            # 类方法:针对类存在的方法
    def introduce(cls):     # cls代表类对象本身
        print(cls.name)
        print()
li = Person()
li.introduce()

优缺点分析:

优点:

  • 严格控制实例数量,节省系统资源
  • 提供全局访问点,方便管理共享资源
  • 避免频繁创建和销毁对象,提高性能

缺点:

  • 违反单一职责原则,既负责业务逻辑又控制实例创建
  • 过度使用会导致代码耦合度高
  • 难以进行单元测试,因为全局状态难以隔离
  • 在多线程环境下需要特殊处理才能保证线程安全

总结:

        类属性是公共的,它被定义在类层面而非实例层面,所有类的实例都可以共享访问这个属性。例如,在一个Student类中定义class_name="高三一班"作为类属性,那么所有Student的实例都能访问到这个班级名称。类属性可以通过类名直接访问(如Student.class_name),也可以通过实例访问(如student1.class_name)。所有类的实例方法、静态方法和类方法都能访问到这个属性。

        静态方法不需要访问类属性,因为静态方法和类、对象没有关联,它更像是一个独立于类的普通函数。静态方法使用@staticmethod装饰器定义,不会自动接收cls或self参数。例如,在MathUtils类中定义一个静态方法add(a,b)来计算两个数的和,这个方法不需要知道任何关于MathUtils类的信息就能正常工作。静态方法通常用于实现与类相关但不需要访问类状态的功能。

        实例属性是私有的,它只能在特定实例的方法内部被访问到。实例属性通常在__init__方法中初始化,每个实例都拥有自己的属性副本。例如,student1.name="张三"和student2.name="李四"就是两个不同的实例属性。只有实例方法(第一个参数为self的方法)能够访问这些属性,因为这些方法需要通过self参数才能引用到具体的实例属性。类方法和静态方法都无法直接访问实例属性,因为它们没有self参数来引用具体的实例。

2.魔法方法&魔法属性

1.什么是魔法方法:

        魔法方法(Magic Methods)是 Python 中一类特殊的方法,其名称以双下划线开头和结尾(如 __init____str__)。这些方法会在特定的情况下被 Python 自动调用,用于实现对象的特定行为或操作。

2.常见的魔法方法:

以下是一些常用的魔法方法及其用途:

  • __init__(self, ...):对象的初始化方法,在创建实例时自动调用。
  • __str__(self):定义对象的字符串表示形式,通常用于 print()str() 调用。
  • __repr__(self):定义对象的官方字符串表示形式,用于调试或 repr() 调用。
  • __len__(self):定义对象的长度,适用于 len() 调用。
  • __add__(self, other):定义对象的加法操作,如 obj1 + obj2
  • __eq__(self, other):定义对象的相等性比较,如 obj1 == obj2
  • __getitem__(self, key):定义对象的索引访问,如 obj[key]
  • __setitem__(self, key, value):定义对象的索引赋值,如 obj[key] = value
  • __delitem__(self, key):定义对象的索引删除,如 del obj[key]
  • __iter__(self):定义对象的迭代行为,用于 for 循环。
  • __next__(self):定义迭代器的下一个值。
  • __call__(self, ...):允许对象像函数一样被调用,如 obj()
3. 魔法属性的说明

        魔法属性(Magic Attributes)是 Python 中一些特殊的属性,通常用于获取对象的元信息或控制对象的行为。常见的魔法属性包括:

  • __dict__:存储对象的属性字典。
  • __class__:返回对象所属的类。
  • __doc__:获取对象的文档字符串(即 """...""" 的内容)。
  • __name__:获取类或函数的名称。
  • __module__:获取对象所属的模块名称。
4. 实际应用示例

以下是一个使用魔法方法的示例,定义一个简单的自定义列表类:

class MyList:
    def __init__(self, data=None):
        if data is None:
            self.data = []
        else:
            self.data = list(data)

    def __str__(self):
        return f"MyList: {self.data}"

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

    def __setitem__(self, index, value):
        self.data[index] = value

    def __iter__(self):
        return iter(self.data)

# 使用示例
my_list = MyList([1, 2, 3])
print(my_list)          # 输出: MyList: [1, 2, 3]
print(len(my_list))     # 输出: 3
print(my_list[1])       # 输出: 2
my_list[1] = 99
print(my_list)          # 输出: MyList: [1, 99, 3]

for item in my_list:
    print(item)         # 输出: 1, 99, 3

5. 魔法方法的注意事项
  • 魔法方法通常由 Python 解释器自动调用,不建议直接调用(如 obj.__init__())。
  • 魔法方法可以重写以定制对象的行为,但需确保不破坏其预期功能。
  • 合理使用魔法方法可以让自定义类更自然地融入 Python 的生态系统。