zoukankan      html  css  js  c++  java
  • 元类

    元类

    元类是类的类,是类的模版。

    元类是控制如何创建类的,正如类是控制如何创建对象的

    type是python中默认的一个内建元素,用来直接控制生成类,python 中任何class定义的类其实都是type类实例化的对象

    class Foo:
    pass
    f1 = Foo()
    print(type(f1))#结果是:<class '__main__.Foo'> 查看实例所属的类
    print(type(Foo))#结果是:<class 'type'> 查看类的类,也就是元类

    创建类的两种方法:

    方法一:元类type创建类

    创建的类名 = type('创建的类名',(所继承的类,),{属性字典})

    def __init__(self,name,age):
    self.name = name
    self.age = age
    def test(self):
    print('=====>')

    Foo = type('Foo',(object,),{'x':1,'__init__':__init__,'test':test})
    #此处将数据属性x=1,和函数属性test ,以及__init__一起加入到类的属性字典中了
    print(Foo)#<class '__main__.Foo'>
    f1 = Foo('alex',18)
    print(f1.name)#alex
    f1.test()#结果是:=====>

    方法二:class创建类

    class Foo:
    x=1
    def __init__(self,name ,age):
    self.name = name
    self.age = age
    def test(self):
    print('=====>')
    f1 = Foo('alex',18)
    f1.test()#结果是:=====>
    print(f1.name)#结果是:alex
    print(Foo)#结果是:class '__main__.Foo'>

    自定义元类

    一个类没有声明自己的元类,python默认它的元类就是type,除了使用元类type,用户可以通过继承的type来自定义元类

    class MyType(type):
    def __init__(self,a,b,c):
    print('元类的构造函数执行')
    # print(a)#Foo
    # print(b)#()
    # print(c)#Foo的属性字典
    def __call__(self, *args, **kwargs):
    # print(self)#结果是:<__main__.MyType object at 0x7f9a43f62b70>
    # 此处self是指Foo
    # print(args,kwargs)#此处args是指('alex',) kwargs是{}
    obj = object.__new__(self)#object.__new__(Foo)
    # 此代码是给FOO产生一个对象,即生成一个实例,即;产生f1
    self.__init__(obj,*args,**kwargs)#Foo.__init__(f1,*args,**kwargs)
    return obj



    class Foo(metaclass=MyType):#Foo=MyType(Foo,'Foo',(),{})
    def __init__(self,name):#此处self是指实例:f1
    self.name =name #f1.name =name


    #print(Foo)#<__main__.MyType object at 0x7fde5d062b70>
    # Foo()#会触发call 方法
    f1= Foo('alex')#实例化会触发call方法,以及init方法
    print(f1.__dict__)#{'name': 'alex'}

     

     

     

     

     

     

     

  • 相关阅读:
    Python--day34--socket模块的方法
    Python--day32--ftp文件传输报错的原因
    Python--day32--struct模块
    Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;
    快捷键(随时补充)
    turtle 20秒画完小猪佩奇“社会人”
    Kibana使用教程
    Elasticsearch: 权威指南
    數據可視化大屏
    newtonsoft文檔說明
  • 原文地址:https://www.cnblogs.com/wode110/p/14866826.html
Copyright © 2011-2022 走看看