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

本质上,我正在努力完成以下任务:

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

class bar(foo):
    meth1 = classmethod(foo.meth1)
有帮助吗?

解决方案

我也不完全确定您想要的确切行为是什么,但假设您希望 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 已经转换为方法,并且第一个参数具有特殊含义。您需要撤消此操作并查看底层函数对象,重新解释“self”的含义。

我还要提醒您,这是一件非常奇怪的事情,因此可能会给阅读您的代码的任何人造成混乱。您最好考虑采用不同的解决方案来解决您的问题。

其他提示

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

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

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

classMethod或不再是一个函数,它是其第一个参数(通常称为“ Cls”),一个类,可以被称为“”。或为“。”。

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

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

当调用 meth1 的代码时,会传递两个参数“self”和“val”。我猜您希望“xyz”被传递为“val”,但您认为什么会被传递为“self”?是否应该是 bar1 实例(在本例中,不需要覆盖)?或者它应该是类栏(那么这段代码会做什么)?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top