(python) 元类

9人阅读 评论(0) 收藏 举报

在了解元类的时候先了解一下储备的知识:


exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。

它的语法是:exec(object,globals,locals)

参数介绍(http://www.runoob.com/python3/python3-func-exec.html)

  • object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

#代码一
code='''
global x
x=0
y=2
'''
globals_dic={'x':10000}
locals_dic={}
exec(code,globals_dic,locals_dic)
print(globals_dic)
print(locals_dic)
#代码二
code='''
x=1
y=2
def f1(self,a,b):
    pass
'''
locals_dic={}
exec(code,{},locals_dic)
print(locals_dic)

我们平常定义一个类是这样子的。用class定义的类使用的类使用产生我们自己的对象的

class Chinese:
    country='china'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def speak(self):
        print('%s speak Chinese'%self.name)
p=Chinese('MONICX',23,'male')
print(type(p))#<class '__main__.Chinese'>
print(type(Chinese))#<class 'type'>

元类,就是类的类。

python内置元类type是用来专门产生class定义的类

what:类名,bases:基类,dict:类体代码。

我们来看一下type是如何来定义一个类的。它的代码过程如下。

class_name='Chinese'
class_base=(object,)
class_body='''
country="china"
def __init__(self,name,age,sex):
    self.name=name
    self.age=age
    self.sex=sex
def speak(self):
    print('%s speak Chinese'%self.name)
'''
class_dic={}
print(exec(class_body,{},class_dic))
Chinese=type(class_name,class_base,class_dic)
print(Chinese)

通过上面的代码我们可以了解到内置元类type得到一个类的底层原理。

那么我们如何自定义一个元类呢!!!!!

自定义元类的储备知识:

# __call__
class Foo:
    #产生对象执行
    def __init__(self):
        pass
    #打印对象执行
    def __str__(self):
        pass
    #回收对象执行
    def __del__(self):
        pass
    #调用对象时执行
    def __call__(self, *args, **kwargs):
        print('__cal__')#__cal__ 
        print('__cal__',args,kwargs)#__cal__ (1, 2, 3) {'m': 1}

obj=Foo()
obj(1,2,3,m=1)


内置元类type内部一定有一个__call__方法,我们自定义一个元类的时候,也要定义一个__call__方法。

我们来看一下自定义元类的实现过程。

class Mymeta(type):
    #控制类的创建
    def __init__(self,class_name,class_base,class_dic):
        # print(class_name)#Foo
        # print(class_base)#(<class 'object'>,)
        # print(class_dic)#{'__module__': '__main__', '__qualname__': 'Foo', 'x': 1, '__init__':
                        # <function Foo.__init__ at 0x0000000001E8A950>, 'f1': <function Foo.f1 at 0x0000000001E8A9D8>}
        if not class_name.istitle():
            raise TypeError('类名的首字母必须大写!')

        if not class_dic.get('__doc__'):
            raise TypeError('类中必须写好文档注释,')
    #控制类Foo的调用,即控制实例化Foo的过程
    def __call__(self, *args, **kwargs):#self=Foo args=(111,
        # print('=======>')
        # print(args)
        # print(kwargs)
        #1、造一个Foo的空对象
        obj=object.__new__(self)#固定代码一
        #2、调用Foo.__init__
        #3、将obj连同调用Foo括号内的参数一同传给__init__
        self.__init__(obj,*args,**kwargs)#固定代码二
        return obj
#Foo=Mymeta('Foo',(object),class_dic)
class Foo(object,metaclass=Mymeta):
    '''
    文档注释
    '''
    x=1

    def __init__(self,y):
       self.y=y

    def f1(self):
        print('form f1')

# obj=Foo()#调用类会产生一个空对象。
# print(obj)

obj=Foo(1111)#Foo.__call__()
print(obj.y)
print(obj.f1)
print(obj.x)


查看评论

深入理解python元类

类和对象在理解什么是元类之前,有必要先理解下,什么是类。 什么是类?通俗的讲,类就是用来创建对象的代码片。在python中,类还有一个奇特的特性,就是类,本身也是一个对象。怎么理解?——在你定义一个类...
  • Allenalex
  • Allenalex
  • 2017-01-09 20:57:18
  • 2372

python元类解析

分享下自己对python的metaclass的知识。   一 你可以从这里获取什么? 1. 也许你在阅读别人的代码的时候碰到过metaclass,那你可以参考这里的介绍。 2....
  • permike
  • permike
  • 2016-08-15 15:37:24
  • 1633

Python单例模式(元类实现)

最近要用到Python的单例模式,在网上找了些方法。其中使用元类实现十分简洁,也很好用。 因为单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的。 其中代码如下: c...
  • junshao90
  • junshao90
  • 2012-10-25 11:31:43
  • 1944

[Python]五分钟理解元类(Metaclasses)

  • lanphaday
  • lanphaday
  • 2008-10-10 11:34:00
  • 24623

利用python元类来实现ORM

利用python元类来实现ORM        python元类有两种实现方式:type() 和 metaclass。        下面利用metaclass方式来实现一个简单的ORM: #!/...
  • chenglinhust
  • chenglinhust
  • 2015-03-25 14:58:08
  • 1455

【python】继承 定制 使用元类

多重继承 在设计类的继承关系时,通常,主线都是单一继承下来的。但是,如果需要“混入”额外的功能,通过多重继承就可以实现。这种设计通常称之为Mixin。由于Python允许使用多重继承,因此,Mixi...
  • u010141025
  • u010141025
  • 2014-12-17 14:02:24
  • 1541

深刻理解Python中的元类(metaclass)以及元类实现单例模式

一、理解类也是对象 在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段...
  • mdzzname
  • mdzzname
  • 2017-12-04 12:01:14
  • 126

python装饰器、类可以用来装饰、元类、type()的使用、python的存储机制:小整数池、intern机制

装饰器 foo = timefun(foo) #foo先作为参数赋值给func后,foo接收指向timefun返回的wrappedfunc foo() #调用foo(),即等价调用wrappedfu...
  • yanhuatangtang
  • yanhuatangtang
  • 2017-07-14 17:58:26
  • 193

python中的元类Metaclass

python中的元类Metaclass理解元类之前需要学习的知识如果说让我们创建一个类,最先想到的肯定是用class创建,当我们使用class创建类的时候,python解释器自动创建这个对象,但是py...
  • weixin_35955795
  • weixin_35955795
  • 2016-10-31 19:17:33
  • 3287

python——type()、metaclass元类和精简ORM框架

1、type()函数 #type()函数既可以返回一个对象的类型,又可以创建出新的类型, # 比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)....
  • jaccty
  • jaccty
  • 2017-08-18 12:28:48
  • 380
    个人资料
    等级:
    访问量: 88
    积分: 131
    排名: 116万+
    文章分类
    文章存档
    最新评论