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 岁 ! 
    

 

 

 

    

 

 

 

 

 

----

posted on 2017-04-17 11:44  蒋乐兴的技术随笔  阅读(506)  评论(0编辑  收藏  举报

导航