1.单列
1.什么是单列
单列是指在计算机编程中,一个类只能创建一个对象的设计模式。它确保一个类始终只有一个实例,并提供全局访问点以获取该实例。
单列模式通常用于需要共享资源或限制实例数量的情况下。例如,数据库连接池、线程池、日志记录器等都可以使用单列模式来管理和控制实例的创建和访问。
在单列模式中,类通常会包含一个静态成员变量来保存唯一的实例,并通过一个静态方法来获取该实例。在第一次调用该方法时,会创建一个新的实例并将其保存在静态变量中,之后的调用则直接返回该实例。
2.单例模式的实现
-
私有构造方法:单例类的构造方法必须是私有的,这样可以防止外部代码通过实例化来创建多个对象。
-
静态变量:单例类必须包含一个静态成员变量,用于保存唯一的实例。通常将其命名为
instance
或类似的名称。 -
全局访问点:单例类必须提供一个全局访问点(通常是静态方法),其他代码通过调用该方法来获取单例实例。
-
延迟实例化(可选):单例实例可以在首次被请求时进行延迟实例化,而不是在类加载时就立即创建。这样可以节省资源并提高性能。
-
线程安全性(可选):如果在多线程环境下使用单例模式,需要考虑线程安全性。可以通过加锁机制或双重检查锁定等方式来确保线程安全。
3.单列实现代码
class Singleton:
__instance = None # 存储单例实例的类变量
def __new__(cls, *args, **kwargs):
if not cls.__instance: # 如果不存在单例实例,则创建新的实例
cls.__instance = super().__new__(cls, *args, **kwargs)
return cls.__instance
# 使用示例
s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # 输出: True,表示s1和s2是同一个实例
2.反射
1.什么是反射
反射(Reflection)是一种编程语言的特性,指的是在运行时动态地获取、检查和修改程序结构的能力。通过反射,我们可以在程序执行期间获取类、对象、方法、属性等信息,并且可以在运行时对它们进行操作和修改。
2.反射实现方法
-
使用内置函数:Python提供了一些内置函数来实现反射操作,如
getattr()
、setattr()
、hasattr()
等。这些函数可以通过对象名和属性名或方法名来获取、设置和检查对象的属性和方法。 -
使用
type()
函数:type()
函数可以返回一个对象的类型信息。通过将对象作为参数传递给type()
函数,可以获取该对象所属的类。还可以使用type()
函数动态创建类,从而实现动态加载和使用类的功能。 -
使用
inspect
模块:inspect
模块是Python标准库中的一个模块,提供了对源代码的解析和分析功能。通过inspect
模块,可以获取类的成员信息、函数的参数信息等。它提供了一系列的函数和类,如inspect.getmembers()
、inspect.isfunction()
、inspect.signature()
等,可以用于实现更复杂的反射操作。 -
使用元类(Metaclass):元类是用于创建类的类。通过定义自己的元类,并使用
__new__()
方法进行定制化处理,可以在类被创建时对其进行修改和扩展。通过元类,可以实现更高级别的反射操作,如动态添加属性和方法等。
3.反射实现代码
class MyClass:
def __init__(self, name):
self.name = name
def greet(self):
print("Hello, I'm", self.name)
# 通过类名动态创建对象
class_name = "MyClass"
obj = globals()[class_name]("Alice") # 使用globals()函数获取全局命名空间中的类
# 调用方法
method_name = "greet"
method = getattr(obj, method_name)
method() # 输出: Hello, I'm Alice
# 访问属性
attr_name = "name"
attr = getattr(obj, attr_name)
print(attr) # 输出: Alice