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

        

    ----

  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/JiangLe/p/6722166.html
Copyright © 2011-2022 走看看