面试题答案
一键面试实现思路
- 动态创建类:
- 使用元类的
__new__
方法,该方法在类创建时被调用。在__new__
方法中,可以根据传入的参数动态地定义类的属性和方法。 - 类方法可以作为元类中创建类的辅助方法,因为类方法可以访问类本身(
cls
),方便在类创建过程中进行与类相关的操作。
- 使用元类的
- 控制类的实例化过程:
- 元类的
__call__
方法在类实例化时被调用。通过在__call__
方法中添加逻辑,可以控制实例化的过程,例如单例模式的实现。 - 静态方法可以作为工具方法,为
__call__
方法提供辅助功能,比如验证参数等,由于静态方法不依赖于类或实例的状态,所以可以独立地完成一些通用的功能。
- 元类的
代码示例
class MetaClass(type):
def __new__(mcs, name, bases, attrs):
# 动态添加一个类方法
def class_method(cls):
return f"This is a class method of {cls.__name__}"
attrs['class_method'] = classmethod(class_method)
# 动态添加一个静态方法
def static_method():
return "This is a static method"
attrs['static_method'] = staticmethod(static_method)
return super().__new__(mcs, name, bases, attrs)
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class MyClass(metaclass = MetaClass):
def __init__(self, value):
self.value = value
代码解释
- 元类定义:
MetaClass
:继承自type
,是自定义的元类。__new__
方法:- 参数:
mcs
代表元类自身(类似self
对于普通类),name
是要创建的类的名称,bases
是要创建的类的基类元组,attrs
是要创建的类的属性字典。 - 在
__new__
方法中,定义了一个类方法class_method
和一个静态方法static_method
,并将它们添加到attrs
字典中。 - 最后通过
super().__new__
创建并返回新的类对象。
- 参数:
__call__
方法:- 该方法控制类的实例化过程。它实现了单例模式,即如果类没有
_instance
属性,就创建一个新的实例,否则返回已有的实例。
- 该方法控制类的实例化过程。它实现了单例模式,即如果类没有
- 使用元类的类定义:
MyClass
:使用MetaClass
作为元类。它有一个__init__
方法,接受一个value
参数并赋值给实例属性self.value
。
使用示例
obj1 = MyClass(10)
obj2 = MyClass(20)
print(obj1 is obj2) # 输出True,因为是单例
print(obj1.class_method())
print(MyClass.static_method())
在上述使用示例中,首先创建了两个MyClass
的实例obj1
和obj2
,由于单例模式,它们是同一个对象。然后调用了动态添加的类方法和静态方法。