题
我想创建一个具有父类方法的子类,其中该方法是子类中的“类方法”,但是 不是 在父类中。
本质上,我正在努力完成以下任务:
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 实例(在本例中,不需要覆盖)?或者它应该是类栏(那么这段代码会做什么)?
不隶属于 StackOverflow