复习时理解的元类

来源: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这种,我们希望让用户以一种我们制定的格式定义代码后,我们就能自动识别这个类并自动组装成一个更加强大的类,只是这个类的组装过程由元类来完成而不是由用户自己完成,用户只需要按照我们约定好的格式去定义一个类就行了,这样既兼顾了用户使用的简单性,又兼顾了我们需要一个强大的类的目的

0
0

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程