Python编程:元类的简单使用

元类

Python 2.7.5 旧式类

class Foo():
    pass

foo = Foo()

print(type(foo))
print(type(Foo))
print(type(type))
# <type 'instance'>
# <type 'classobj'>
# <type 'type'>

Python 3.6.5 新式类

class Foo():
    pass

foo = Foo()

print(type(foo))
print(type(Foo))
print(type(type))
# <class '__main__.Foo'>
# <class 'type'>
# <class 'type'>

type是一个元类,任何类都是它的实例。

就像一个普通的对象是一个类的实例一样


Python中的任何新式类 以及 Python3中的任何类 都是type元类的一个实例


x是类Foo的一个实例。

Foo是type元类的一个实例。

type也是type元类的一个实例,所以它是它自己的一个实例。

Python编程:元类的简单使用

以下测试,在Python 3.6.5 中完成

动态定义类

type函数

type(<name>, <bases>, <dict>)

<name> 类名称 __name__属性
<bases> 继承类的基类元组,__bases__属性
<dict> 包含类主体定义的名称空间字典,__dict__属性

例如

# -*- coding: utf-8 -*-

def get_name(self):
    return "foo"


# 定义类
Foo = type("Foo", (object, ), {"name": "foo", "get_name": get_name})


foo = Foo()

# 获取属性
print(foo.name)
# foo


# 调用方法
print(foo.get_name())
# foo

以上定义的类相当于

class Foo(object):
    name = "foo"

    def get_name(self):
        return "foo"

通过元类的方式给子类添加属性

# -*- coding: utf-8 -*-

class Meta(type):
    def __new__(cls, name, bases, dct):
        instance = super().__new__(cls, name, bases, dct)
        instance.name = "meta"
        return instance


class Foo(metaclass=Meta):
    pass


print(Foo.name)
# meta

通过继承的方式给子类添加属性

# -*- coding: utf-8 -*-

class Base(object):
    name = "meta"


class Foo(Base):
    pass


print(Foo.name)
# meta

通过类装饰器的方式给子类添加属性

# -*- coding: utf-8 -*-

def decorator(cls):
    class NewClass(cls):
        name = "meta"

    return NewClass


@decorator
class Foo(object):
    pass


print(Foo.name)
# meta


参考

Python黑魔法:元类

上一篇:Python编程:设置Python解释器不生成字节码pyc文件


下一篇:手机不支持js的confirm函数