zoukankan      html  css  js  c++  java
  • python中的元类(metaclass)

    认识python中元类的准备工作。

    1,首先需要明白一个概念就是python中一切皆为对象。

    input:
    class Trick(object):
    pass
    
    print type('1234')
    print type(1234)
    print type(Trick())
    
    output:
    <type 'str'>
    <type 'int'>
    <class '__main__.Trick'>

    2,什么是新式类,旧式类

    知乎上的这篇文章个人表示不错,言简意赅:https://www.zhihu.com/question/22475395

    1)首先,写法不一样:

    class A:
        pass
    
    class B(object):
        pass

    2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。
    3)新式类更符合OOP编程思想,统一了python中的类型机制。

    3,type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))  例子:type('trick', (), {})

    下面开始进入主题:什么是元类

    元类就是创建类的类,心里话工作中确实没有用到过,可能因为没有用到过才在想什么是元类,真的用到过可能不会再问为什么会有元类。

    在stackoverflow看到的例子粘贴过来

    函数做元类传递给类

    input:
    def upper_attr(class_name, class_parents, class_attr):
        """
        返回一个对象,将属性都改为大写的形式
        :param class_name:  类的名称
        :param class_parents: 类的父类tuple
        :param class_attr: 类的参数
        :return: 返回类
        """
        # 生成了一个generator
        attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__'))
        uppercase_attrs = dict((name.upper(), value) for name, value in attrs)
        return type(class_name, class_parents, uppercase_attrs)
    
    __metaclass__ = upper_attr
    
    pw = upper_attr('Trick', (), {'bar': 0})
    print hasattr(pw, 'bar')
    print hasattr(pw, 'BAR')
    print pw.BAR
    
    output:
    False
    True
    0

    正式类来作为元类传递给__metaclass__

    class UpperAttrMetaClass(type):
        def __new__(mcs, class_name, class_parents, class_attr):
            attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__'))
            uppercase_attrs = dict((name.upper(), value) for name, value in attrs)
            return super(UpperAttrMetaClass, mcs).__new__(mcs, class_name, class_parents, uppercase_attrs)
    
    
    class Trick(object):
        __metaclass__ = UpperAttrMetaClass
        bar = 12
        money = 'unlimited'
    
    print Trick.BAR
    print Trick.MONEY

    为什么要存在元类

    元类的的目的:拦截类的创建,然后修改一些特性,然后返回该类。

    就是感觉是装饰器干的事情,只是装饰器是修饰一个函数,同样是一个东西进去,然后被额外加了一些东西,最后被返回。

    What is metaclass in Python http://stackoverflow.com/ques... 

  • 相关阅读:
    Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
    Android 解决listview中checkBox错位选择
    带checkbox的ListView实现(一)——数据与渲染完全分离的传统实现方式
    ViewPager + Fragment实现滑动标签页
    android中使用PopupWindow实现弹出窗口菜单
    Android TextView背景颜色与背景图片设置
    Android特效 五种Toast详解
    Android 带checkbox的listView 实现多选,全选,反选
    android 截取指定位置字符串
    带checkbox的ListView实现(二)——自定义Checkable控件的实现方法
  • 原文地址:https://www.cnblogs.com/jingtyu/p/7473101.html
Copyright © 2011-2022 走看看