【发布时间】:2020-02-18 08:10:59
【问题描述】:
我试图理解为什么在使用带有静态方法作为参数的抽象类的实现时,pycharm 会警告我错误类型。
为了演示,我将做一个简单的例子。假设我有一个带有一个方法的抽象类,一个实现(继承)这个类似接口的抽象类的类,以及一个获取它应该用作参数的实现的方法。
import abc
class GreetingMakerBase(abc.ABC):
@abc.abstractmethod
def make_greeting(self, name: str) -> str:
""" Makes greeting string with name of person """
class HelloGreetingMaker(GreetingMakerBase):
def make_greeting(self, name: str) -> str:
return "Hello {}!".format(name)
def print_greeting(maker: GreetingMakerBase, name):
print(maker.make_greeting(name))
hello_maker = HelloGreetingMaker()
print_greeting(hello_maker, "John")
请注意,在print_greeting 的类型提示中,我使用了GreetingMakerBase,因为isinstance(hello_maker, GreetingMakerBase) is True Pycharm 没有抱怨它。
问题是我的类有很多实现,不想为每个类创建一个实例,所以我将这个make_greeting 方法设为静态,如下所示:
class GreetingMakerBase(abc.ABC):
@staticmethod
@abc.abstractmethod
def make_greeting(name: str) -> str:
""" Makes greeting string with name of person """
class HelloGreetingMaker(GreetingMakerBase):
@staticmethod
def make_greeting(name: str) -> str:
return "Hello {}!".format(name)
def print_greeting(maker: GreetingMakerBase, name):
print(maker.make_greeting(name))
print_greeting(HelloGreetingMaker, "John")
这仍然以相同的方式工作,但显然因为函数调用中的参数现在是类名而不是它的实例,Pycharm 抱怨说:
Expected type 'GreetingMakerBase', got 'Type[HelloGreetingMaker]' instead.
有没有一种方法可以解决这个警告而不必实例化 HelloGreetingMaker 类?
【问题讨论】:
标签: python-3.x pycharm static-methods type-hinting abstract-methods