MST

星途 面试题库

面试题:Python元类与类创建的深度定制

使用元类来创建一个类,要求在类创建时,自动将类中所有方法名变为大写形式。请详细解释元类的工作原理,以及在这个特定场景中是如何实现对类创建过程的定制的。
44.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class UpperMethodMeta(type):
    def __new__(cls, name, bases, attrs):
        new_attrs = {}
        for attr_name, attr_value in attrs.items():
            if callable(attr_value):
                new_attrs[attr_name.upper()] = attr_value
            else:
                new_attrs[attr_name] = attr_value
        return super().__new__(cls, name, bases, new_attrs)


class MyClass(metaclass=UpperMethodMeta):
    def my_method(self):
        print("This is my method.")


obj = MyClass()
obj.MY_METHOD()

元类工作原理

  1. 类也是对象:在Python中,一切皆对象,类本身也是对象,而元类就是创建这些类对象的“类”。
  2. type作为默认元类:默认情况下,Python使用type作为元类来创建类。例如,class MyClass: pass 等同于 MyClass = type('MyClass', (), {}),这里type的第一个参数是类名,第二个参数是基类的元组,第三个参数是包含类属性和方法的字典。
  3. 自定义元类:通过继承type类,我们可以创建自定义元类。自定义元类允许我们在类创建的过程中进行定制化操作。当定义一个类并指定metaclass参数时,Python会使用指定的元类来创建这个类,而不是默认的type

在特定场景中的实现

  1. __new__方法:在自定义元类UpperMethodMeta中,我们重写了__new__方法。__new__方法是在类创建时首先调用的方法,它负责创建并返回新的类对象。
  2. 遍历属性:在__new__方法中,我们遍历类的属性字典attrs。对于每个属性,如果它是可调用的(即方法),我们将其方法名转换为大写形式,并将修改后的键值对存入新的属性字典new_attrs中。对于非方法的属性,我们保持原样存入new_attrs
  3. 创建类对象:最后,我们调用super().__new__方法,将修改后的属性字典new_attrs传递进去,以创建并返回新的类对象。这样,新创建的类中的所有方法名就都变为大写形式了。