python __new__静态方法

看下面的实例:

import collections

class OrderAttribute(type):

    @classmethod
    def __prepare__(metacls, name, bases, **kwds):
        return collections.OrderedDict()


    def __new__(cls, name, bases, namespace, **kwds):
        result = super(OrderAttribute, cls).__new__(cls, name, bases, namespace)
        result._order = tuple(n for n in namespace if not n.startswith('__'))
        return result


class OrderPreserved:
    __metaclass__ = OrderAttribute

class Something(OrderPreserved):
    this = 'text'
    def z(self):
        return False
    b = 'order is preserved'
    c = 'more text'



if __name__ == '__main__':
    print(Something._order)
    # ('this', 'z', 'b', 'c')

通常我们使用内置的type创建的类型会使用dict来存储不同的属性和方法。因为字典时无序的,所以属性和方法没有和特别的顺序。我们可以使用__prepare__特殊方法,该方法在类创建之前执行。它的工作时创建初始的命令空间对象,类定义最后被添加到这个对象中。这个方法可以处理任何在类的主体开始执行前需要的准备工作。__new__静态方法在类的主体被加入命名空间后开始执行。它的参数时要创建的类对象,类名,基类的元组和创建好的 命名空间匹配对象。上面这个例子将__new__的真正工作委托给了基类。

你可能感兴趣的:(python __new__静态方法)