【发布时间】:2018-05-07 05:50:24
【问题描述】:
给定一个函数foo:
def foo(x):
pass
通过调用str 或repr 打印它的表示会给你一些无聊的东西:
str(foo)
'<function foo at 0x119e0c8c8>'
我想知道是否可以覆盖函数的__str__ 方法来打印其他内容。本质上,我想做:
str(foo)
"I'm foo!'
现在,我知道函数的描述应该来自函数的文档字符串__doc__。然而,这只是一个实验。
在试图找出解决这个问题的方法时,我遇到了为 classes 实现 __str__:How to define a __str__ method for a class?
这种方法涉及使用__str__ 方法定义元类,然后尝试在实际类中分配__metaclass__ 挂钩。
我想知道是否可以对 function 类做同样的事情,所以这就是我尝试过的 -
In [355]: foo.__class__
Out[355]: function
In [356]: class fancyfunction(type):
...: def __str__(self):
...: return self.__name__
...:
In [357]: foo.__class__.__metaclass__ = fancyfunction
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
我认为这行不通,但值得一试!
那么,为函数实现__str__ 的最佳方式是什么?
【问题讨论】:
-
str(foo)期间调用了哪些方法/函数?不应该是foo.__str__()吗?为什么我们不能简单地做foo.__str__ = lambda : "I'm a foo!"? -
@EricDuminil
__str__函数不可写。 -
@MosesKoledoye:Python 在
foo.__str__ = lambda : "I'm a foo!"期间不会抱怨,因为它是私有方法,所以语法应该不同吗?作业被忽略了吗? -
@EricDuminil 是的,它不会抱怨,因为任意属性可以绑定到函数实例。其实你可以做
f.__str__ = lambda: 6和foo.__str__()返回6;不强制执行字符串返回值。__str__是通过type(foo)使用钩子调用的函数,而不是通过实例foo。 -
太好了,谢谢。