2008-09-15 96 views
1

我想做一个子类,它有一个父类的方法,其中的方法是子类中的'classmethod',但是父类中的不是装饰父类方法

从本质上讲,我试图完成以下任务:

class foo(Object): 
    def meth1(self, val): 
     self.value = val 

class bar(foo): 
    meth1 = classmethod(foo.meth1) 

回答

3

我也不完全确定你想要的确切行为是什么,但假设你想让bar.meth1(42)等同于foo.meth1是bar的一个classmethod(用“self”作为

def convert_to_classmethod(method): 
    return classmethod(method.im_func) 

class bar(foo): 
    meth1 = convert_to_classmethod(foo.meth1) 

与类方法(foo.meth1的问题)是foo.meth1已经转换的方法,与第一个参数有特殊的含义:类),那么你就可以达致这。你需要撤消这个并查看底层函数对象,重新解释“自我”的含义。

我也会提醒,这是一件非常奇怪的事情,因此很容易导致任何人阅读代码时感到困惑。你可能会更好地考虑解决你的问题。

3

什么是你想实现什么?如果我在实时Python代码中看到这样的构造,我会考虑击败原始程序员。

0

提出的这个问题对我来说似乎很奇怪:我看不出为什么有人会这样做。您可能误解了Python中的“classmethod”(它与Java中的静态方法有点不同)。

一个正常的方法或多或少只是一个函数,它的第一个参数(通常称为“self”),该类的一个实例,以及被调用为“。”。

classmethod或多或少只是一个函数,它将第一个参数(通常称为“cls”)作为一个类,它可以作为“。”调用。或称为“。”。

考虑到这一点,以及上面显示的代码,如果有人创建了bar的实例并调用meth1,您会发生什么情况?

bar1 = bar() 
bar1.meth1("xyz") 

当调用meth1的代码时,会传递两个参数'self'和'val'。我想你会期待“xyz”被传递给'val',但是你在想什么会被'自我'传递?它应该是bar1实例(在这种情况下,不需要覆盖)?或者应该是班级吧(这个代码会做什么)?