看下面的实例:
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__
的真正工作委托给了基类。