面试题答案
一键面试1. 实参和形参在元类中的传递、解析和使用
在Python中,元类是用于创建类的类。当我们定义一个类时,实际上是调用了元类的__new__
方法来创建类对象,之后调用__init__
方法对类对象进行初始化。
形参
元类的__new__
和__init__
方法的形参定义了在创建类时可以接收的参数。__new__
方法的典型签名为:
def __new__(cls, name, bases, attrs, **kwargs):
pass
cls
:当前元类。name
:要创建的类的名称,是一个字符串。bases
:要创建的类的基类,是一个元组。attrs
:一个字典,包含要创建的类的属性和方法。**kwargs
:额外的关键字参数。
__init__
方法的典型签名为:
def __init__(self, name, bases, attrs, **kwargs):
pass
参数含义与__new__
类似,不过self
是已经创建好的类对象(在__new__
中返回的对象)。
实参
当定义一个类并指定元类时,实参通过类定义的语法传递。例如:
class MyMeta(type):
def __new__(cls, name, bases, attrs, custom_param=None):
# 处理参数
if custom_param:
attrs['custom_attr'] = custom_param
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MyMeta, custom_param='Hello'):
pass
这里custom_param='Hello'
就是传递给元类的实参,在元类的__new__
方法中可以解析和使用这个参数。
2. 利用元类中函数的参数机制实现类的动态创建与定制
控制类属性的生成
class AttrMeta(type):
def __new__(cls, name, bases, attrs, prefix=''):
new_attrs = {}
for key, value in attrs.items():
new_key = prefix + key
new_attrs[new_key] = value
return super().__new__(cls, name, bases, new_attrs)
class MyClass(metaclass=AttrMeta, prefix='custom_'):
value = 42
obj = MyClass()
print(hasattr(obj, 'custom_value')) # 输出: True
在这个例子中,元类AttrMeta
通过prefix
参数动态修改类属性的名称。
方法的绑定
def custom_method(self):
return "This is a custom method"
class MethodMeta(type):
def __new__(cls, name, bases, attrs, bind_method=False):
if bind_method:
attrs['custom_method'] = custom_method
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MethodMeta, bind_method=True):
pass
obj = MyClass()
print(obj.custom_method()) # 输出: This is a custom method
在这个例子中,元类MethodMeta
根据bind_method
参数决定是否将custom_method
绑定到类上。