1. ホーム
  2. python

子クラスに親のメソッドをオーバーライドさせる

2023-11-11 09:26:54

質問

以下のような未実装のメソッドを持つ基底クラスがあるとします。

class Polygon():
    def __init__(self):
        pass

    def perimeter(self):
        pass

    def area(self):
        pass

さて、私の同僚の一人がPolygonクラスを使って、次のようにサブクラスを作成したとします。

import math

class Circle(Polygon):
    def __init__(self, radius):
        self.radius = radius

    def perimeter(self):
        return 2 * math.pi * self.radius

(H/Sh)eはarea()メソッドを実装し忘れています。

サブクラスに親のarea()メソッドを強制的に実装させるにはどうしたらよいでしょうか。

どのように解決するのですか?

は、あなたの親クラスになる可能性があります。

class Polygon():

    def __init__(self):
        raise NotImplementedError

    def perimeter(self):
        raise NotImplementedError

    def area(self):
        raise NotImplementedError

のように、子クラスのインスタンスがこれらのメソッドを呼び出そうとしたときに、 実行時にのみ問題が発見されることになりますが。


別のバージョンでは abc.abstractmethod .

from abc import ABC, abstractmethod
import math


class Polygon(ABC):

    @abstractmethod
    def __init__(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

    @abstractmethod
    def area(self):
        pass

class Circle(Polygon):
    def __init__(self, radius):
        self.radius = radius

    def perimeter(self):
        return 2 * math.pi * self.radius

#    def area(self):
#        return math.pi * self.radius**2


c = Circle(9.0)
# TypeError: Can't instantiate abstract class Circle
#            with abstract methods area

をインスタンス化することはできません。 Circle をインスタンス化することはできません。

これは python 3 の構文です。 python 2 では

class Polygon(object):
    __metaclass__ = ABCMeta


また、バイナリ特殊関数については __eq__(), __lt__(), __add__(), ... を使う方がよいでしょう。 return NotImplemented を上げるのではなく NotImplementedError .