1.单例模式
概念定义:
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只能有一个实例,并提供一个全局访问点来获取该实例。这种模式在需要控制资源访问、配置管理或协调系统操作时特别有用。
核心特点:
- 私有构造函数:防止外部通过new创建实例
- 静态私有成员变量:保存类的唯一实例
- 静态公有方法:提供获取实例的全局访问点,通常命名为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] = valuedef __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 的生态系统。