我想修改 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 的原型属性那样直接编辑类,最好将它们子类化。这让您可以添加您想要的功能,而不是强制它在任何地方使用。
子类:
class int(int):
def foo(self):
print "foo"
int(2).foo()