zoukankan      html  css  js  c++  java
  • Python 元类metaclass 和 基类(超类)object

    import os
    
    
    '''
    Python 基类和元类
        - 看了那么多问答, 其实我还是晕的. 其实单纯看一个的话我是理解了, 但是两个放一起, 就懵了. 想的脑袋都疼
        - 基类 object:
            - python 类继承关系的顶端,  object.__bases__  它的继承为空(), 也就是它是所有类的爸爸或者爷爷..., 所有类以它为起点
            - 然后. Python一切皆对象, 所以 object 也是对象, 是对象就有实现类.
            - 所以: object.__class__  它的实现类是type   <class 'type'>
        - 元类(metaclass) type:
            - 单独来看, 元类挺简单的, 就是类工厂, 创建类的东西
            - 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。
            - class关键字就是使用元类通过__new__和__init__创建出一个类
            - 元类的还有一个作用就是定义类型, 定义object(对象的类型)
            
        - 一起来看就很奇怪, 也是我没有理解的地方
            - object是type的实例
            - type继承object
            - type是type自己的实例
            
        - 代码:
            object.__class__
                <class 'type'>
            type.__class__
                <class 'type'>
            object.__bases__
                ()
            type.__bases__
                (<class 'object'>,)
    '''
    
    
    
    '''
    stack over flow 关于元类的回答:
    
        元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。
        
        尽管在Python中您可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。
        type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。您将无法type纯粹在Python中重新创建类似的内容,但是Python有点作弊。
        要在Python中创建自己的元类,您实际上只想将其子类化type。
        
        元类最常用作类工厂。当通过调用类创建对象时,Python通过调用元类来创建一个新类(当执行“ class”语句时)。
        因此,将元类与普通方法__init__和__new__方法结合使用,可以使您在创建类时做“额外的事情”,例如使用某些注册表注册新类或将其完全替换为其他类。
        
        当class执行语句时,Python首先将class语句的主体作为普通代码块执行。生成的名称空间(字典)保留了将来类的属性。通过查看要成为类的基类(继承了元类),
        要成为类的__metaclass__属性(如果有)或__metaclass__全局变量来确定元类。然后使用该类的名称,基数和属性调用该元类以实例化它。
        
        但是,元类实际上定义了一个类的类型,而不仅仅是它的工厂,因此您可以使用它们做更多的事情。
        例如,您可以在元类上定义常规方法。这些元类方法就像类方法,因为它们可以在没有实例的情况下在类上调用,但是它们也不像类方法,因为它们不能在类的实例上被调用。
        type.__subclasses__()是type元类上方法的示例。您还可以定义正常的“魔力”的方法,如__add__,__iter__和__getattr__,执行或如何变化的类的行为。
    '''
    
  • 相关阅读:
    Objective-C NSFileManager 文件管理总结
    ScrollView在RelativeLayout失效问题
    解决myeclipse中struts2 bug问题包的替换问题
    SOA究竟是个啥
    Flash--元件和实例
    MyEclipse中加入web项目到tomcat
    [C]if (CONDITION)语句中CONDITION的情况
    GTK经常使用控件之笔记本控件( GtkNotebook )
    org.apache.solr.handler.dataimport.DataImportHandlerException: Data Config problem: 对实体 &quot;characterEn
    Android自动测试之Monkey工具
  • 原文地址:https://www.cnblogs.com/MasonHu/p/14201535.html
Copyright © 2011-2022 走看看