首先,请查看以下代码:
from typing import Type
class C:
@staticmethod
def c_fun():
return 23
class C1(C):
@staticmethod
def c1_fun():
return 42
class M:
def __init__(self, c: Type[C]):
self.c = c()
class M1(M):
def __init__(self, c: Type[C1]):
super().__init__(c=c)
# self.c = c()
def m1_fun(self):
print(self.c.c1_fun())
def show_type(self):
print(type(self.c))
M1(c=C1).m1_fun() # Output: 42
M1(c=C1).show_type() # Output: <class '__main__.C1'>
代码按照预期进行编译和工作,没有任何错误。然而,PyCharm中的Python linter在引用时会显示以下警告
self.c.c1_fun()
在M1中。m1_fun():
Unresolved attribute reference 'c1_fun' for class 'C'
虽然它似乎在编译过程中解决了。确保
self.c
,我把它打印出来,在编译过程中它似乎是C1。
当我取消注释时
self.c = c()
在M1中__init__;()linter警告消失了——但我想避免重复,因为在类M的构造函数中已经这样做了。
我的问题是:
-
我做错了什么吗,就像皮查姆·林特所说的那样?
-
有没有不重复作业的好方法?
编辑:
我找到了一个
similar question
-似乎使用泛型是一种方式(正如在当前帖子的选择答案中所做的那样)。