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... 

posted @ 2017-09-04 12:54  jimtong  阅读(264)  评论(0编辑  收藏  举报