我想创建一个子类,该类具有父类的方法,其中该方法是子类中的“classmethod”,但父类中的不是。
基本上,我正在尝试完成以下任务:
class foo(Object):
def meth1(self, val):
self.value = val
class bar(foo):
meth1 = classmethod(foo.meth1)
答案 0 :(得分:3)
你想要完成什么?如果我在实时Python代码中看到这样的构造,我会考虑击败原始程序员。
答案 1 :(得分: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已经转换为方法,对第一个参数有特殊含义。你需要撤消这个并查看底层函数对象,重新解释“self”的含义。
我还要提醒一下,这是一件非常奇怪的事情,因此可能会让任何阅读代码的人感到困惑。你最好不要考虑解决问题的不同方法。
答案 2 :(得分:0)
提出的问题对我来说似乎很奇怪:我不明白为什么有人会这样做。你可能误解了Python中的“类方法”(它与Java中的静态方法有点不同)。
普通方法或多或少只是一个函数,它作为第一个参数(通常称为“self”),类的一个实例,并被调用为“。”。
classmethod或多或少只是一个函数,它作为第一个参数(通常称为“cls”),一个类,并且可以作为“。”调用。或者作为“。”。
考虑到这一点,以及上面显示的代码,如果有人创建bar实例并在其上调用meth1,您会发生什么?
bar1 = bar()
bar1.meth1("xyz")
当调用meth1的代码时,会传递两个参数'self'和'val'。我猜你期望“xyz”被传递给'val',但是你认为你为'自己'传递了什么?它应该是bar1实例(在这种情况下,不需要覆盖)?或者它应该是类栏(这个代码会做什么)?