使用抽象方法

时间:2017-09-08 11:12:32

标签: python python-2.7 pycharm abstract-class

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类的特定目的覆盖抽象方法。结果我到处都有类型提示错误。

1 个答案:

答案 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))