修改Python类
我想要修改Python中的所有类,比如字符串(str)、整数(int)以及像Person这样的自定义类。
我想给它们添加一个属性,并且改变它们的方法的工作方式。
这样做的最佳方法是什么呢?是使用元类吗?
4 个回答
1
你不能像在JavaScript中直接修改类的原型那样直接编辑这个类,最好是通过创建一个子类来实现。这种方式可以让你添加想要的功能,而不需要强迫在所有地方都使用这个功能。
2
内置类是不能被修改的,但你可以通过创建一个同名的类来“隐藏”这个内置类(当然,其他类也是可以的)。
举个例子,假设我们想给一堆类添加一个新的属性“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)
来调用。
3
虽然你可以通过重新赋值属性的方式来修改在Python代码中定义的类(但对于内置类是无效的),不过我建议你不要这么做。最好是创建一个子类并使用这个子类,或者写一些函数,让它们接受类的实例作为参数,而不是自己添加方法。这样做可能会导致代码变得尴尬且不稳定,尤其是当你同时使用多个库,并且它们都试图对同一个类进行修改时。
你是不是在尝试解决某个具体的问题呢?