2010-01-29 67 views
2

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

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

这是最好的方法吗?元类?

+2

有什么用呢? – 2010-01-29 21:36:44

+0

实现Python的污点模式。 – 2010-01-29 21:50:08

+2

您还需要能够重新实现语言中的所有操作符。我认为你不会做你想做的事。 – 2010-01-29 22:19:31

回答

0

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

+0

好的,我该如何编程?我想将这个修改应用到很多类。我不想全部通过手工扩展。 – 2010-01-29 21:27:19

+0

您可能想要使用返回该类的修改版本的类装饰器。那么你只需要在每个应该修改的类的顶部添加“@yourdecorator”。 – AndiDog 2010-01-29 21:32:06

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',)}) 

注意,像“侨”,23裸露的文字仍然属于真正类 - 有没有办法改变这种状况;您需要使用str('ciao')int(23)来使用“假”类。

+0

你怎么能超载更改类的\ _ \ _ add__方法? – 2010-01-29 22:23:13

+0

完全相同的方式。 – 2010-01-30 00:30:13

3

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

是否有一个实际的问题,你试图解决这个问题?

0

子类:


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

int(2).foo()