修改Python类

修改Python类,python,metaclass,Python,Metaclass,我想修改Python中的所有类。例如str和int以及其他类似Personobject的元素 我想给它们添加一个属性,并改变其方法的工作方式 哪种方法是最好的?元类?不能像使用javascript的prototype属性那样直接编辑该类,最好将其子类化。这样,您就可以添加所需的功能,而不必强制在任何地方都使用它。内置类不能修改,但您可以隐藏一个内置类,当然也可以使用相同的名称隐藏任何其他类 例如,假设更改是向一组类添加一个初始值为23的新属性foobar,并向这些类的每个实例添加一个初始值为45

我想修改Python中的所有类。例如str和int以及其他类似Personobject的元素

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


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

不能像使用javascript的prototype属性那样直接编辑该类,最好将其子类化。这样,您就可以添加所需的功能,而不必强制在任何地方都使用它。

内置类不能修改,但您可以隐藏一个内置类,当然也可以使用相同的名称隐藏任何其他类

例如,假设更改是向一组类添加一个初始值为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'和int23来使用伪类。

虽然您可以对python代码中定义的类执行此操作,但通过重新分配其属性对内置类不起作用,请不要实际执行此操作。只需创建子类并使用子类,或者编写将类的实例作为参数的函数,而不是添加自己的方法。如果您同时使用多个库试图对同一类执行此操作,则执行您必须考虑的操作会导致代码笨拙、脆弱

您试图用这种方法解决实际问题吗?

子类:


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

int(2).foo()

好的,我怎样才能编程呢?我想将此修改应用于许多类。我不想手工扩展所有的类。你可能想使用一个类装饰器,它会为类返回一个修改过的版本。然后,您只需在每个应该修改的类的顶部添加@yourdecorator。decorator只是一个类,以编程方式,您将使用一个返回函数的函数。。。。str=decortoreststr与我们所知道的应用@property和返回修饰函数的函数propertystr的方法相同,在本例中,它被修饰为property实现Python的污染模式。您还需要能够重新实现该语言中的所有运算符。我不认为你能做你想做的事,因为Python没有像Perl那样给变量赋值的神奇的stdin,我不知道你为什么需要它。只需验证/转义所有输入。我遗漏了一些奇怪的东西吗?你怎么能为更改的类重载uuuu add uuuuu方法?