zoukankan      html  css  js  c++  java
  • python元类编程

    什么叫元类?   年轻人先不要在意这些细节、我们一步一步的来!

    001、

        oop的世界里有一句话 “万物皆对象” 

    class Person(object):
        name=None
    
    if __name__=="__main__":
        i=123
        s="hello world"
        p=Person()
        print(type(i)) #<class 'int'>
        print(type(s)) #<class 'str'>
        print(type(p)) #<class '__main__.Person'>
    
        print(type(int)) #<class 'type'>
        print(type(str)) #<class 'type'>
        print(type(Person)) #<class 'type'>

    我们来说一下上面代码的意思

        1、前三句我们可以看出:i 是int 类的实例,s是str类的实例,p是Person类的实例;#我下面要说的话,可以让你感觉到不适

        2、后三句我们可以看出:int,str,Person 这些类事实上它们都只是type类的一个实例

    002、

        我真的没有逗你、type它真的是一个类呀!不信你help(type)看一下

    class type(object)
     |  type(object_or_name, bases, dict)
     |  type(object) -> the object's type
     |  type(name, bases, dict) -> a new type
     |  
     |  Methods defined here:
     |  
     |  __call__(self, /, *args, **kwargs)
     |      Call self as a function.
     |  
     |  __delattr__(self, name, /)
     |      Implement delattr(self, name).
     |  
     |  __dir__(...)
     |      __dir__() -> list
     |      specialized __dir__ implementation for types
     |  
     |  __getattribute__(self, name, /)
     |      Return getattr(self, name).
     |  
     |  __init__(self, /, *args, **kwargs)
     |      Initialize self.  See help(type(self)) for accurate signature.
     |  
     |  __instancecheck__(...)
     |      __instancecheck__() -> bool
     |      check if an object is an instance
     |  
     |  __new__(*args, **kwargs)
     |      Create and return a new object.  See help(type) for accurate signature.

    003、

        上文我们说到类事实上是type的实例、我现在根你说另一件事 所有继承自type的类都是元类

        例子:

    003、

        为了得到满足我们要求的数据类型我们会自己去定义类、例如我们自己定义一个Person类

    class Person(object):
        name=None

    上面这两行是我们最常用的,用于定义类的方法了,有了Person 这个数据类型后我就可以创建类的实例了p=Person();

    但是我们这里要讲的是python oop中的更加高级的话题---- 元类 。

        

    class Mode(type):
        def __new__(cls,name,bases,attrs):
            print("----    in __new__ fun")
            print("cls :    {0}".format(cls))   #cls:    <class '__main__.Mode'>
            print("name:    {0}".format(name))  #name:    Person
            print("bases:   {0}".format(bases)) #bases:   (<class 'object'>,)
            print("attrs:   {0}".format(attrs)) #attrs:   {'__module__': '__main__', '__qualname__': 'Person'}
    
            def toString(self):
                return '你好我的名字叫 {0} 今年 {1} 岁 !'.format(self.name,self.age)
            
            attrs['toString']=toString
            attrs['name']='蒋乐哥哥'
            attrs['age']=16
            print(id(attrs))
            print("****    out __new__ fun")
            return type.__new__(cls,name,bases,attrs)
    
        def __init__(cls,name,bases,attrs):
            print("----    in __init__ fun")
            print("cls :    {0}".format(cls))   #cls :    <class '__main__.Person'>
            print("name:    {0}".format(name))  #name:    Person
            print("bases:   {0}".format(bases)) #bases:   (<class 'object'>,)
            print("attrs:   {0}".format(attrs)) #attrs:   {'toString': <function Mode.__new__.<locals>.toString at 0x101cf5d90>, '__module__': '__main__', '__qualname__': 'Person'}
            print("***    out __init__ fun")
    
    
    class Person(object,metaclass=Mode):
        pass
    
    if __name__=="__main__":
        p=Person()
        print(p.toString()) #你好我的名字叫 蒋乐哥哥 今年 16 岁 ! 
        

        

    ----

  • 相关阅读:
    Flink-Record
    Linux Performance Observaibilty Tools
    DEC-UPDATE
    经济与选择(持续更新)
    GIS操作汇集(更新)
    JULY-Record-update
    GO (待更新)
    Python打包分发工具setuptools简介(转)
    HashMap源码分析
    nginx配置负载均衡
  • 原文地址:https://www.cnblogs.com/JiangLe/p/6722166.html
Copyright © 2011-2022 走看看