WEB开发网
开发学院软件开发Python Python 中的元类编程 - 理解继承的奥秘和实例创建... 阅读

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()

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Python 编程 理解

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接