# 3、在元类中控制自定义的类无需__init__方法
# 1.元类帮其完成创建对象,以及初始化操作;
# 2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
# 3.key作为用户自定义类产生对象的属性,且所有属性变成大写
class Mymeta3(type):
def __call__(self, *args, **kwargs):
# *args接收位置参数
# **kwargs接收关键字参数
# 通过判断这两个可变长的参数是否有值,即可判断是否通过关键字传参
if not kwargs or args:
# 关键字参数为空或位置参数元组有值,抛出异常
raise TypeError('must use keyword argument')
print(args)
print(kwargs)
# 调用new生成空对象
obj = self.__new__(self)
# 调用init初始化对象
self.__init__(obj)
print('将key全部变成大写之前:', obj.__dict__)
# key作为用户自定义类产生对象的属性,且所有属性变成大写
for key, value in kwargs.items():
# key不是全大写,将key大写化加入字典
if not key.isupper():
upper_key = key.upper()
obj.__dict__[upper_key] = value
# key全大写,直接加入字典
else:
obj.__dict__[key] = value
print('将key全部变成大写后:', obj.__dict__)
return obj
class Foo(metaclass=Mymeta3):
pass
obj = Foo(name='admin', AGe=18, GENDER='male')
print(obj.__dict__)
# 输出内容:
# ()
# {'name': 'admin', 'AGe': 18, 'GENDER': 'male'}
# 将key全部变成大写之前: {}
# 将key全部变成大写后: {'NAME': 'admin', 'AGE': 18, 'GENDER': 'male'}
# {'NAME': 'admin', 'AGE': 18, 'GENDER': 'male'}