1

我想创建一个具有父类方法的子类,其中该方法是子类中的“classmethod”,而不是父类中的“classmethod”。

本质上,我正在尝试完成以下任务:

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

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

3 回答 3

3

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

于 2008-09-15T20:34:53.307 回答
3

我也不完全确定您想要的确切行为是什么,但假设您希望 bar.meth1(42) 等同于 foo.meth1 是 bar 的类方法(其中“self”是类),那么您可以通过以下方式实现:

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

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

classmethod(foo.meth1) 的问题是 foo.meth1 已经被转换为方法,第一个参数有特殊含义。您需要撤消此操作并查看底层函数对象,重新解释“自我”的含义。

我还提醒说,这是一件很奇怪的事情,因此可能会给阅读您的代码的任何人造成混淆。您可能最好通过不同的解决方案来解决您的问题。

于 2008-09-15T20:53:20.190 回答
0

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

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

类方法或多或少只是一个函数,它的第一个参数(通常称为“cls”)是一个类,并且可以作为“.”调用。或作为“.”。

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

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

当调用 meth1 的代码时,会传递两个参数“self”和“val”。我猜你希望“xyz”被传递给“val”,但你认为什么被传递给“self”?它应该是 bar1 实例吗(在这种情况下,不需要覆盖)?还是应该是类栏(那么这段代码会做什么)?

于 2008-09-15T21:02:08.060 回答