当前位置:首页 > Python教程 > python技巧

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() ifnot 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() ifnot 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 = unlimitedprint Trick.BAR
print Trick.MONEY

为什么要存在元类

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

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

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

原文:http://www.cnblogs.com/jingtyu/p/7473101.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐