from abc import ABCMeta, abstractmethod
class Shape(object):
_metaclass_ = ABCMeta
@abstractmethod
def calculate_area(self):
""" Returns the area of the shape
:return str: A string of the area. """
pass
def print_area(self):
area = self.calculate_area()
print("Area is " + area)
在此示例中,所有形状都以不同方式计算其区域,但所有子类都有一个打印当前区域的常用方法。 Pycharm在最后一行抱怨area
,说它有None
而不是TypeVar('AnyStr', str, unicode)
。这是有道理的,因为calculate_area
什么都不返回。另一方面,calculate_area
是一个抽象方法,因此它不会直接在Shape
下调用,它将由子类以不同方式实现。显然,calculate_area
的返回类型不能在Child类上强制执行,但是由于calculate_area
是抽象的,因此PyCharm不应该告诉我类型错误吗?
我想知道Pycharm是否有错,或者我是,这不是实现这个抽象类的方法,我应该尝试不同的方法?
这是一个最小的例子。我正在处理的代码在抽象类中有一个主(非抽象)方法,它调用许多抽象方法。 main函数通常适用于所有Child类,但需要为Child类的特定目的覆盖抽象方法。结果我到处都有类型提示错误。
答案 0 :(得分:1)
问题是示例中的calculate_area
隐式返回None。你可以“修复它”#34;通过返回一个空字符串。这将捕获子类只在其super(Subclass, self).calculate_area()
中返回calculate_area
的情况:
class Shape(object):
_metaclass_ = ABCMeta
@abstractmethod
def calculate_area(self):
""" Returns the area of the shape
:return str: A string of the area. """
return ""
def print_area(self):
area = self.calculate_area()
print("Area is " + area)
然而,添加字符串并不是一种好的风格。因此,如果您使用format
,问题首先不会存在,因为format
可以处理任何具有__repr__
或__str__
方法的对象(几乎任何宾语)。因此即使calculate_area
返回None
或者它返回一个数字而不是字符串,它也会起作用:
class Shape(object):
_metaclass_ = ABCMeta
@abstractmethod
def calculate_area(self):
""" Returns the area of the shape
:return str: A string of the area. """
pass
def print_area(self):
area = self.calculate_area()
print("Area is {}".format(area))