MST

星途 面试题库

面试题:Python元类与类实例创建的关联

请解释Python中元类(metaclass)的概念,并说明元类是如何影响类实例的创建过程的。编写一个自定义元类,使得通过该元类创建的类实例在创建时,所有属性名自动转换为大写形式,并举例说明如何使用这个元类创建类及实例。
11.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

元类概念

在Python中,元类是创建类的类。也就是说,类是元类的实例。通常情况下,我们定义的类是type类的实例,type就是Python的内建元类。元类允许我们控制类的创建过程,包括类的属性和方法的定义等,这使得我们可以在类创建时动态修改类的结构。

元类对类实例创建过程的影响

元类影响类实例创建过程主要体现在类创建阶段。当定义一个类时,元类会决定类如何被构造,比如可以修改类的属性、方法等。在创建类实例时,会调用类的__new____init__方法,而元类可以影响类的这些方法的定义或者添加额外的逻辑。

自定义元类实现属性名大写

class UpperAttrMetaClass(type):
    def __new__(cls, class_name, bases, attrs):
        new_attrs = {attr_name.upper(): attr_value for attr_name, attr_value in attrs.items() if not callable(attr_value) and not attr_name.startswith('__')}
        return super().__new__(cls, class_name, bases, new_attrs)


class MyClass(metaclass=UpperAttrMetaClass):
    my_attr = 10


obj = MyClass()
print(hasattr(obj, 'MY_ATTR'))  
print(obj.MY_ATTR)  

解释

  1. 自定义元类 UpperAttrMetaClass:继承自type,在__new__方法中,遍历类的属性字典attrs,将非方法且非双下划线开头的属性名转换为大写,生成新的属性字典new_attrs,然后通过super().__new__创建类。
  2. 使用元类创建类 MyClass:在定义MyClass时指定metaclass=UpperAttrMetaClass,这样MyClass在创建时会受到UpperAttrMetaClass的控制。
  3. 创建实例并验证:创建MyClass的实例obj,验证是否存在大写属性名MY_ATTR并能正确获取其值。