修改Python类

3 投票
4 回答
6606 浏览
提问于 2025-04-15 18:39

我想要修改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代码中定义的类(但对于内置类是无效的),不过我建议你不要这么做。最好是创建一个子类并使用这个子类,或者写一些函数,让它们接受类的实例作为参数,而不是自己添加方法。这样做可能会导致代码变得尴尬且不稳定,尤其是当你同时使用多个库,并且它们都试图对同一个类进行修改时。

你是不是在尝试解决某个具体的问题呢?

撰写回答