修改一个Python类
我想修改Python中的所有类。 例如str和int以及像Person(object)这样的其他类。
我想为它们添加一个属性并改变它的方法的工作方式。
这是最好的方法? 元类?
虽然你可以通过重新分配它们的属性来为python代码中定义的类执行此操作(它不适用于内置代码),但实际上并不这样做。 只需子类并使用子类,或者编写以该类的实例作为参数而不是添加自己的方法的函数。 做你必须介意的事情会导致尴尬,脆弱的代码,特别是如果最终同时使用多个库来尝试对同一类执行此操作。
是否有一个实际的问题,你试图解决这个问题?
内置的类不能被修改,但是你可以通过同一个名字来“隐藏”一个内置的类(或者任何其他的类)。
例如,假设改变是为一堆类添加一个初始值为23的新属性“foobar”,并为这些类的每个实例添加一个初始值为45的新属性“murf”。下面是一种方法:
def changedclass(cls):
def __init__(self, *a, **k):
cls.__init__(self, *a, **k)
self.murf = 45
return type(cls.__name__, (cls,), {'foobar': 23, '__init__': __init__})
def changemany(changed, classes_by_module):
for module, classnames in classes_by_module.iteritems():
for name in classnames:
cls = getattr(module, name)
subcls = changed(cls)
setattr(module, name, subcls)
import __builtin__
import mymod
changemany(changedclass, {__builtin__: ('int', 'str'), mymod: ('Person',)})
请注意,像ciao和23这样的文字仍然属于真正的课程 - 没有办法改变它; 你需要使用str('ciao')
和int(23)
来使用“假”类。
你不能像使用javascript的prototype属性那样直接编辑类,如果你继承它们,它会更好。 这让你添加你想要的功能,而不是强迫它在任何地方使用。
链接地址: http://www.djcxy.com/p/75509.html