假设有一个名为 foo
的函数:
def foo(x):
pass
通过调用str
或repr
打印其表示形式会得到一些无聊的东西,例如:
str(foo)
'<function foo at 0x119e0c8c8>'
我想知道是否可以重写一个函数的__str__
方法以打印其他东西。基本上,我想做的是:
str(foo)
"I'm foo!'
现在,我明白函数的描述应该来自函数的文档字符串__doc__
。然而,这只是一个实验。
在尝试解决这个问题时,我发现可以为类
实现__str__
:如何为类定义__str__方法?
该方法涉及定义一个具有__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!"
? - Eric Duminil__str__
不可写。 - Moses Koledoyefoo.__str__ = lambda: "I'm a foo!"
期间不会抱怨,因为它是一个私有方法,所以语法应该有所不同吗?这个赋值是被简单地忽略了吗? - Eric Duminilf.__str__ = lambda: 6
和foo.__str__()
返回6
;字符串返回值不是强制执行的。使用type(foo)
钩子调用函数的__str__
,而不是通过实例foo
调用。 - Moses Koledoye