• Python中神奇的「type」,即可查看类型,又可以创建对象


    任何事物都逃不过历史包袱,除非他设计之后就一成不变,在看Python的type类型的时候,才发现也有这个问题。type除了用来查看一个对象是什么类型外,可以用来创建类,神不神奇。这是为了兼容历史。
    这篇文章就记录一下type创建类,这就不得不说到元类(metaclass)。

    stackoverflow上面有一个比较详细的解释[1]。
    函数 type 实际上是一个元类。 type 是 Python 用于在幕后创建所有类的元类。
    在Python3中使用metaclass这个关键字来给一个类声明元类(Python2中使用__metaclass__这个属性)。
    例如:

    class Foo(metaclass=MyMetaClass):
        pass
    
    • 1
    • 2

    一个完整的元类的例子如下:

    class UpperAttrMetaclass(type):
        def __new__(cls, clsname, bases, attrs):
            uppercase_attrs = {
                attr if attr.startswith("__") else attr.upper(): v
                for attr, v in attrs.items()
            }
    
            # Python 3 can use no-arg super() which infers them:
            return super().__new__(cls, clsname, bases, uppercase_attrs)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用:

    class Foo(metaclass=UpperAttrMetaclass):
        bar = 'bip'
    
    • 1
    • 2

    所以为什么要使用元类?
    元类的主要用例是创建 API,一个典型的例子是 Django ORM。

    class Model(AltersData, metaclass=ModelBase):
        def __init__(self, *args, **kwargs):
            # Alias some things as locals to avoid repeat global lookups
            cls = self.__class__
            opts = self._meta
            _setattr = setattr
            _DEFERRED = DEFERRED
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    来定义一个person类:

    class Person(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
    
    • 1
    • 2
    • 3

    这个例子中,Person是一个类,它继承了models.Model,这个类是一个元类,它创建了一个类,这个类有name和age两个属性。这个类的实例就是数据库中的一条记录。
    直接访问属性:

    person = Person(name='bob', age='35')
    print(person.age)
    
    • 1
    • 2

    它不会返回 IntegerField 对象。它将返回一个 int 对象,这是因为在 Person 类的元类中,它将 IntegerField 转换为 int 对象。
    Django 通过公开一个简单的 API 并使用元类,从该 API 重新创建代码来完成幕后的实际工作,从而使复杂的事情看起来简单。
    所以,元类的作用就是创建类,定制一些行为。
    但是,99% 的情况下,你不需要自己写元类。有一些别的方式可以做到同样的事情:
    monkey patching
    class decorators

    [1] stackoverflow.com/questions/100003/what-are-metaclasses-in-python

  • 相关阅读:
    学习C++图像处理最快最好的途径
    Vue3+node.js网易云音乐实战项目 歌单页面详细代码
    第20章 接口手册【C++】
    Java面试题
    springboot+臻绿原客绿色食品商城 毕业设计-附源码161928
    Windows查看端口和进程
    Connor学Android - AsyncTask基本使用与源码解析
    业务可视化-让你的流程图"Run"起来(6.定时任务&Spring-Batch的集成)
    计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习
    高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介
  • 原文地址:https://blog.csdn.net/shanchuan2012/article/details/134470812