Python 中的元类编程 - 理解继承的奥秘和实例创建
2007-03-29 12:10:53 来源:WEB开发网核心提示: 读者可能知道,通过覆盖其 .__str__() 方法可以改变一个类对象的打印输出形式,Python 中的元类编程 - 理解继承的奥秘和实例创建(6),同样,通过覆盖它的元类的 .__str__() 方法也可以修改一个类的打印输出形式,当然,您仍然可以在 C 中定义一个 .__str__()
读者可能知道,通过覆盖其 .__str__() 方法可以改变一个类对象的打印输出形式。同样,通过覆盖它的元类的 .__str__() 方法也可以修改一个类的打印输出形式。例如:
清单 9. 定制类的打印输出形式
>>> class Printable(type):
... def __str__(cls):
... return "This is class %s" % cls.__name__
...
>>> class C(object): __metaclass__ = Printable
...
>>> print C # equivalent to print Printable.__str__(C)
This is class C
>>> c = C()
>>> print c # equivalent to print C.__str__(c)
<C object at 0x40380a6c>
这种情况可以用下图来表示:
图 3. 元类与魔法方法
前面的讨论表明, Printable 类中的._str_()方法不能覆盖C中的 .__str__() 方法,C 中的 .__str__() 方法继承于 object ,因此优先级高,所以打印 c 将仍旧输出标准的结果。
如果 C 是从 Printable 而不是 object 中继承了 .__str__() 方法,可能会导致一个问题:C 实例不会拥有 .__name__ 属性并且在打印 c 时将产生一个错误。当然,您仍然可以在 C 中定义一个 .__str__() 方法来改变输出 c 的方式。
类方法与元方法
另一个常见的混淆出现在 Python 类方法与定义在元类中的类方法(最好称之为 元方法)之间。
考虑下面这个例子:
清单 10. 元方法和类方法
>>> class M(Printable):
... def mm(cls):
... return "I am a metamethod of %s" % cls.__name__
...
>>> class C(object):
... __metaclass__=M
... def cm(cls):
... return "I am a classmethod of %s" % cls.__name__
... cm=classmethod(cm)
...
>>> c=C()
更多精彩
赞助商链接