2

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

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

哪个是最好的方法?元类?

4

4 回答 4

3

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

您正在尝试以这种方式解决实际问题吗?

于 2010-01-29T21:48:20.813 回答
1

内置类无法修改,但您可以用同名之一“隐藏”内置类(当然也可以是其他任何类)。

例如,假设更改是为一组类添加一个初始值为 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)使用“假”类。

于 2010-01-29T21:39:55.983 回答
0

您不能像使用 javascript 的原型属性那样直接编辑类,最好将它们子类化。这让您可以添加您想要的功能,而不是强制它在任何地方使用。

于 2010-01-29T21:23:24.160 回答
0

子类:


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

int(2).foo()
于 2010-01-29T22:25:17.697 回答