Python重写类定义之外的

2024-09-27 21:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个我已经导入的模块,它工作正常,但是没有提供一个好的__str__方法,我想添加一个。你知道吗

在某些混合语言中:

from foo import Foo

Foo.prototype._str__ = function myNIcePrintFunction(){

}

这条Python我怎么办?你知道吗


Tags: 模块方法fromimport语言foofunctionprototype
2条回答

你可以先定义一个函数,然后修补它。你知道吗

比如:

def foostr(self):
    return 'A foo str'

Foo.__str__ = foostr

或使用λ表达式:

Foo.__str__ = lambda self: 'Another foo str'

不过,这个方法的Foo.__str__.__name__等不同,但str(..)内置函数将按预期工作。我们可以使用cd4的大部分元数据:

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)中的第一个类)。你知道吗

例如:

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

相关问题 更多 >

    热门问题