复习时理解的元类
来源:8-7 通过元类实现orm-2

qq_走过的路_4
2019-06-17
第一次看元类时还是一点没懂。复习时对元类的理解,有的地方为了方面记忆 可能理解的不对
class MetaClass(type): # 元类一定要继承type
def __new__(cls, *args, **kwargs):
# 一定要return
# args里面其实是 (name, bases, dict)和 type()创建类的参数一致。
# args里面包含了Dog的所有类属性和方法信息。(不包括实例变量?)
# 根据args里面包含的这些信息,动态的创建类,增删改相应的属性和方法。
name, bases, attrs = args
if name == 'Dog' and attrs['breed'] == '泰迪':
attrs['hairs'] = '卷毛'
attrs['weight'] = '5KG'
attrs['run'] = cls.run # 添加类方法
name = 'Cat' # 甚至把类名都改了
attrs['__qualname__'] = 'Cat'
bases = (Animal,) # 继承Animal
args = (name, bases, attrs)
return super().__new__(cls, *args, **kwargs)
@classmethod
def run(cls):
print('我跑起来,灵魂都追不上')
class Animal(object):
def fight(self):
print('逼急了兔子也会咬人')
class Dog(metaclass=MetaClass): # 设置元类metaclass
breed = '泰迪'
def __init__(self, name, age=6):
self.name = name
self.age = age
def __str__(self):
return self.name
def say(self):
print('我叫{0},今年{1}岁'.format(self.name, self.age))
print('我是{0},体重大约{1}'.format(self.hairs, self.weight))
if __name__ == '__main__':
dog = Dog(name='乐乐')
dog.say()
dog.run()
dog.fight()
print(type(dog)) # <class '__main__.Cat'>
写回答
1回答
-
bobby
2019-06-18
其实可以这样简单理解:95%以上的情况下我们是用不着使用元类编程的,但是对于一些特殊的情况,比如form和orm中的model这种,我们希望让用户以一种我们制定的格式定义代码后,我们就能自动识别这个类并自动组装成一个更加强大的类,只是这个类的组装过程由元类来完成而不是由用户自己完成,用户只需要按照我们约定好的格式去定义一个类就行了,这样既兼顾了用户使用的简单性,又兼顾了我们需要一个强大的类的目的
00
相似问题