我想修改Python中的所有类。例如str和int以及其他像Person(object)。
我想为它们添加一个属性并改变其方法的工作方式。
哪种方法最好?元类?
答案 0 :(得分:3)
虽然你可以通过重新分配它们的属性来为python代码中定义的类(它不适用于内置的类)执行此操作,但请不要实际执行此操作。只需子类化并使用子类,或者编写将类的实例作为参数的函数,而不是添加自己的方法。做你想要的事情会导致代码变得笨拙,脆弱,特别是如果你最终同时使用多个库来尝试对同一个类进行操作。
您是否尝试以这种方式解决实际问题?
答案 1 :(得分:1)
内置类无法修改,但您可以使用相同名称“隐藏”内置类(或任何其他类)。
例如,假设更改是向一堆类添加一个新属性“foobar”,其初始值为23,并向这些类的每个实例添加一个新属性“murf”其初始值为45.这是一种方式:
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)
来使用“假”类。
答案 2 :(得分:0)
你不能像使用javascript的prototype属性那样直接编辑类,如果你继承它们会更好。这让你可以添加你想要的功能,而不是强迫它在任何地方使用。
答案 3 :(得分:0)
子类:
class int(int):
def foo(self):
print "foo"
int(2).foo()