Встроенные классы нельзя изменить, но вы можете «скрыть» встроенный класс (или любой другой, разумеется) под тем же именем.
Например, предположим, что изменение заключается в добавлении к группе классов нового атрибута "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, по-прежнему будут принадлежать классам real - изменить это невозможно; вам нужно использовать str('ciao')
и int(23)
, чтобы использовать "поддельные" классы.