面试题答案
一键面试元类概念
在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)
解释
- 自定义元类
UpperAttrMetaClass
:继承自type
,在__new__
方法中,遍历类的属性字典attrs
,将非方法且非双下划线开头的属性名转换为大写,生成新的属性字典new_attrs
,然后通过super().__new__
创建类。 - 使用元类创建类
MyClass
:在定义MyClass
时指定metaclass=UpperAttrMetaClass
,这样MyClass
在创建时会受到UpperAttrMetaClass
的控制。 - 创建实例并验证:创建
MyClass
的实例obj
,验证是否存在大写属性名MY_ATTR
并能正确获取其值。