修改一个Python类

我想修改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的prototype属性那样直接编辑类,如果你继承它们,它会更好。 这让你添加你想要的功能,而不是强迫它在任何地方使用。

链接地址: http://www.djcxy.com/p/75509.html

上一篇: Modifying a Python class

下一篇: Variable value is determined by function call