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'}

     

     

     

     

     

     

     

  • 相关阅读:
    Android java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor ver
    Android EditText光标位置(定位到最后)
    Android EditText获取光标位置并插入字符删除字符
    Android 仿微信小视频录制
    Android仿微信小视频录制功能
    Android消息机制之实现两个不同线程之间相互传递数据相互调用
    Android Data Binding 技术
    Android中解析XML
    Android 怎样把光标放在EditText中文本的末尾处?
    Hadoop HBase概念学习系列之RowKey设计(二十九)
  • 原文地址:https://www.cnblogs.com/wode110/p/14866826.html
Copyright © 2011-2022 走看看