# 1、在元类中控制把自定义类的数据属性都变成大写
class Mymeta1(type):
def __new__(cls, name, bases, attrs):
print(attrs)
update_attrs_dict = {}
for key, value in attrs.items():
if not callable(value) and not key.startswith('__') and not key.isupper():
upper_key = key.upper()
update_attrs_dict[upper_key] = value
else:
update_attrs_dict[key] = value
return type.__new__(cls, name, bases, update_attrs_dict)
class People(metaclass=Mymeta1):
name = '111'
age = 18
def foo(self):
pass
print(People.__dict__)
# 输出内容:
# {'__module__': '__main__', '__qualname__': 'People', 'name': '111', 'age': 18, 'foo': <function People.foo at 0x0000023DE14F5598>}
# {'__module__': '__main__', 'NAME': '111', 'AGE': 18, 'foo': <function People.foo at 0x0000023DE14F5598>, '__dict__': <attribute '__dict__' of 'People' objects>, ......}
# 2、 控制自定义类生成的对象中数据属性都变成大写
# 调用类产生对象的三个过程:
# 一个对象能被调用,说明该对象或该类的元类中有__call__
# 1、调用时会执行__call__
# 2、然后依次执行__new__方法(优先执行改写过得new方法,如果没有就执行object的new方法),生成空对象
# 3、接着执行__init__方法(优先执行改写过的init方法,如果没有就执行object的init方法),完成对象初始化
# 4、最后返回该对象
class Mymeta2(type):
# 1
def __call__(self, *args, **kwargs):
# 2
obj = self.__new__(self)
# 3
self.__init__(obj, *args, **kwargs)
# -------------定制化过程---------
print('修改前:', obj.__dict__)
updated_dict = {}
for key, value in obj.__dict__.items():
if not key.isupper():
updated_key = key.upper()
updated_dict[updated_key] = value
obj.__dict__ = updated_dict
print('修改后:', obj.__dict__)
# ------------------------------
# 4
return obj
class Animal(metaclass=Mymeta2):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def say(self):
print('动物的叫声')
obj = Animal('cat', 'male')
print(obj.__dict__)
# 输出内容:
# 修改前: {'name': 'cat', 'gender': 'male'}
# 修改后: {'NAME': 'cat', 'GENDER': 'male'}
# {'NAME': 'cat', 'GENDER': 'male'}