Как проверить, был ли метод перезаписан дочерним классом? - PullRequest
1 голос
/ 06 апреля 2020

Я хочу иметь возможность проверить, переписал ли дочерний класс метод. Например,

class Foo:
    def __init__(self):
        # Is there something following this sort of spec?
        print("overridden" if self.bar != Foo.bar else "not overridden")
    def bar(self):
        return 0

Унаследованным методом, который перезаписывает bar, может быть:

class Kung(Foo):
    def __init__(self):
        super(Kung, self).__init__()
    def bar(self):
        return 1

В этом случае Kung() должно вывести «переопределено», но Foo() должно печать "не переопределена". Могу ли я проверить, был ли bar перезаписан в __init__ из Foo без проверки возвращаемого значения?

1 Ответ

1 голос
/ 06 апреля 2020

Это очень странная вещь. Я подвергаю сомнению дизайн, который потребовал бы этого. В любом случае, вы можете проверить что-то вроде:

class Foo:
    def __init__(self):
        try:
            bar = type(self).bar
        except AttributeError:
            bar = None
        if bar is None or bar is Foo.bar:
            print("not overriden")
        else:
            print("overridden")

    def bar(self): return 0

Это работает, потому что вы проверяете bar на объектах класса . Если вы используете some_instance.some_method, то при каждом вызове создается новый объект метода, поэтому ваш подход не будет работать.

Обратите внимание:

>>> class Foo:
...     def bar(self): pass
...
>>> foo = Foo()
>>> foo.bar is foo.bar
False

Однако

>>> Foo.bar is Foo.bar
True
...