python3如何使用元类

来源:互联网 发布:影音后期制作软件大全 编辑:程序博客网 时间:2024/05/05 15:25

在python2中可以通过定义一个类级别属性__metaclass__来实创建元类,不过在python3中取消了__metaclass__属性。python3中可以通过在定义类的时候声明metaclass参数来创建元类。

实例1:增加一个__author__类属性

class Author(type):    def __new__(cls, name, bases, attrs):        attrs['__author__'] = 'xiemanR'        return type.__new__(cls, name, bases, attrs)class MyBlog(metaclass=Author):    passprint(MyBlog.__author__)a = MyBlog()print(a.__author__)

实例2:使用元类创建单例模式

class Singleton(type):    def __new__(cls, name, bases, attrs):        print('new')        attrs['instance'] = None        return super(Singleton, cls).__new__(cls, name, bases, attrs)    def __call__(cls, *args, **kwargs):        print('call')        if cls.instance is None:            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)        return cls.instanceclass Foo(metaclass=Singleton):    passx = Foo()y = Foo()print(id(x))print(id(y))

实例3:将类属性转化为大写的形式

class Upper(type):    def __new__(cls, name, bases, dct):        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))        uppercase_attr = dict((name.upper(), value) for name, value in attrs)        return type.__new__(cls, name, bases, uppercase_attr)class Bar(metaclass=Upper):    foo = 'foo'    test = 'test'b = Bar()print(b.FOO)print(b.TEST)

原创粉丝点击