2024-09-27 21:34:07 发布
网友
假设我有一个我已经导入的模块,它工作正常,但是没有提供一个好的__str__方法,我想添加一个。你知道吗
__str__
在某些混合语言中:
from foo import Foo Foo.prototype._str__ = function myNIcePrintFunction(){ }
这条Python我怎么办?你知道吗
你可以先定义一个函数,然后修补它。你知道吗
比如:
def foostr(self): return 'A foo str' Foo.__str__ = foostr
或使用λ表达式:
Foo.__str__ = lambda self: 'Another foo str'
不过,这个方法的Foo.__str__.__name__等不同,但str(..)内置函数将按预期工作。我们可以使用cd4的大部分元数据:
Foo.__str__.__name__
str(..)
from functools import wraps def foostr(self): return 'A foo str' Foo.__str__ = wraps(Foo.__str__)(foostr)
但是Foo.__str__.__qualname__将导致'superfoo.__str__'(例如,superfoo实现Foo的方法解析顺序(MRO)中的第一个类)。你知道吗
Foo.__str__.__qualname__
'superfoo.__str__'
superfoo
Foo
例如:
>>> class Foo: ... pass ... >>> str(Foo()) '<__main__.Foo object at 0x7f807046e668>' >>> Foo.__str__ = lambda self: 'another Foo str' >>> str(Foo()) 'another Foo str'
如果您有权访问Foo类的实现,那么最好只在类中定义一个__str__函数,而不是在以后的过程中定义它。你知道吗
您可以像这样重写任何类函数,同时保留原始功能:
class a(): pass def monkey(fn): def newfn(self,*args, **kw): print('hijacked!') return fn(self,*args, **kw) return newfn a.__str__ = monkey(a.__str__) b = a() print(str(b)) >>> hijacked! >>> <__main__.a object at 0x7f61f19faa58>
你可以先定义一个函数,然后修补它。你知道吗
比如:
或使用λ表达式:
不过,这个方法的
Foo.__str__.__name__
等不同,但str(..)
内置函数将按预期工作。我们可以使用cd4的大部分元数据:但是
Foo.__str__.__qualname__
将导致'superfoo.__str__'
(例如,superfoo
实现Foo
的方法解析顺序(MRO)中的第一个类)。你知道吗例如:
如果您有权访问
Foo
类的实现,那么最好只在类中定义一个__str__
函数,而不是在以后的过程中定义它。你知道吗您可以像这样重写任何类函数,同时保留原始功能:
相关问题 更多 >
编程相关推荐