面试题答案
一键面试元类对类方法调用机制的影响
- 元类创建类:元类是创建类的类,当定义一个类时,如果指定了元类(通过
metaclass
关键字),元类的__new__
和__init__
方法会被调用,用于创建和初始化类对象。在这个过程中,元类可以动态修改类的属性,包括方法定义。 - 动态修改方法定义:元类可以在类创建时修改类的字典,添加、删除或替换方法。例如,可以在元类的
__init__
方法中,对类的字典进行操作。
实例创建和方法调用过程中Python解释器的处理
- 实例创建:当使用类创建实例时,首先调用类的
__new__
方法创建实例对象,然后调用__init__
方法初始化实例。此时,实例对象会继承类的属性和方法。 - 方法调用:当实例调用方法时,Python解释器首先在实例的字典中查找方法,如果找不到,则在类的字典中查找。如果类的字典中也没有找到,会继续在类的父类字典中查找,直到找到或抛出
AttributeError
。
结合描述符协议说明三者交互关系
- 描述符协议:描述符是一个实现了
__get__
、__set__
或__delete__
方法的对象。在方法调用过程中,描述符起着重要作用。类的方法本质上是描述符,当实例调用方法时,描述符的__get__
方法会被调用。 - 元类、类和实例交互:元类创建类时,可以定义类的属性为描述符。当实例创建后调用方法(描述符)时,描述符的
__get__
方法接收实例和类作为参数。元类可以通过修改类的描述符来控制方法调用逻辑。
代码示例
class MethodCallMeta(type):
def __init__(cls, name, bases, attrs):
def new_method(self):
print(f"Calling {self.__class__.__name__}.new_method, original method intercepted.")
if 'original_method' in attrs:
setattr(cls, 'original_method', new_method)
super().__init__(name, bases, attrs)
class MyClass(metaclass=MethodCallMeta):
def original_method(self):
print("Original method implementation.")
obj = MyClass()
obj.original_method()
在上述代码中,MethodCallMeta
元类在类MyClass
创建时,将original_method
替换为新的方法。当实例obj
调用original_method
时,执行的是元类修改后的逻辑。这展示了如何利用元类实现高级的方法调用控制逻辑。