尽管Python主要是动态语言,但有一些本机对象类型,如str,file(包括stdout),dict和list,它们实际上是在低级别C中实现的,并且是完全静态的:
>>> a = []
>>> a.append = 'something else'
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object attribute 'append' is read-only
>>> a.hello = 3
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute 'hello'
>>> a.__dict__ # normal python classes would have this
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute '__dict__'如果您的对象是本机C代码,那么您唯一的希望就是使用实际的常规类。对于您的情况,如上所述,您可以执行以下操作:
class NewOut(type(sys.stdout)):
def write(self, *args, **kwargs):
super(NewOut, self).write('The new one was called! ')
super(NewOut, self).write(*args, **kwargs)
sys.stdout = NewOut()或者,做一些类似于原始代码的事情:
original_stdoutWrite = sys.stdout.write
class MyClass(object):
pass
sys.stdout = MyClass()
def new_stdoutWrite(*a, **kw):
original_stdoutWrite("The new one was called! ")
original_stdoutWrite(*a, **kw)
sys.stdout.write = new_stdoutWrite