修改Python类

时间:2010-01-29 21:13:54

标签: python metaclass

我想修改Python中的所有类。例如str和int以及其他像Person(object)。

我想为它们添加一个属性并改变其方法的工作方式。

哪种方法最好?元类?

4 个答案:

答案 0 :(得分:3)

虽然你可以通过重新分配它们的属性来为python代码中定义的类(它不适用于内置的类)执行此操作,但请不要实际执行此操作。只需子类化并使用子类,或者编写将类的实例作为参数的函数,而不是添加自己的方法。做你想要的事情会导致代码变得笨拙,脆弱,特别是如果你最终同时使用多个库来尝试对同一个类进行操作。

您是否尝试以这种方式解决实际问题?

答案 1 :(得分:1)

内置类无法修改,但您可以使用相同名称“隐藏”内置类(或任何其他类)。

例如,假设更改是向一堆类添加一个新属性“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)来使用“假”类。

答案 2 :(得分:0)

你不能像使用javascript的prototype属性那样直接编辑类,如果你继承它们会更好。这让你可以添加你想要的功能,而不是强迫它在任何地方使用。

答案 3 :(得分:0)

子类:


class int(int):
  def foo(self):
   print "foo"

int(2).foo()