• 关于元类的说明


    First

    我们先来看一段代码

    class type(object):
        """
        type(object_or_name, bases, dict)
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
        """

    这是一段 type “函数”的解释。

    我们通常知道的是,当我们不确定一个对象是什么类型时,会使用这个函数查询该对象的类型。如:

    a = [1, 3, 4]
    
    type(a)  # <class 'list'>

     但 type 的作用远不止于此。现在我们回过头来看开始提到的解释。

    type(name, bases, dict) -> a new type  # 一个新的对象。

    这就是 type 的另一层含义。我们来看一段代码。

    animal = type("animal",(object,),{"a": "aa"})
    
    an = animal()
    print(an.a)  # aa

    这里 使用 type 创建了一个对象,这个对象的对象名叫:“animal”,它有一个属性:a,值为“aa”。我们可以直接实例化这个对象并获取属性值。

    看到这里,你应该知道:type 原来可以创建类。那 object 类是谁创建的呢?

    众所周知,object 类是所有类的基类,也就是父类,不过是经典类还是新式类,都继承了object。

    我们来看看 object 的父类是谁。

     看到了吧,原来 object 竟然也是type创建的。

    那么 type 到底是个什么东西呢?其实他就是一个创建类对象的类,即元类,可以这么理解:元类就是类的类。

    问题又来了,type 的父类是谁?难道它就没有父类吗?

     哈哈哈~ type 创建了自己,但它却是继承自 object 的。

    下面我们用 type 创建一个类,并给他添加方法及属性。

    name = "zs"
    age = 12
    
    @classmethod
    def tell(cls):
        print("")
    
    @staticmethod
    def eat():
        print("")
    
    def run():
        print("")
    
    Person = type("Person", (object,), {"name": name, "age": age, "run":run, "eat":eat, "tell":tell})
    
    person = Person()
    print(person.name)
    person.tell()
    person.eat()
  • 相关阅读:
    10个强大的Apache开源模块
    Flume日志收集(转载)
    hbase安装配置(整合到hadoop)
    Hadoop与HBase兼容版本汇总
    关于Mysql Proxy LUA实现Mysql读写分离
    Redis发布了集群版3.0.0 beta
    Spring MVC 学习之 400 错误
    Mahout安装(Hadoop 1.2.1 版本)
    【Android】性能优化
    【Android】asynchronous http client
  • 原文地址:https://www.cnblogs.com/RiverMap/p/12649761.html
Copyright © 2020-2023  润新知