Как я могу сказать, какой класс в полиморфной иерархии содержит метод, который я собираюсь вызвать? - PullRequest
0 голосов
/ 23 сентября 2011

Если у меня есть:

class A():
    def f(self):
        print("running function, f from class A")
class B(A):
    def __init__(self):
        A.__init__(self)
    def f(self):
        print("running function, f from class B")

, и я создаю экземпляр класса B и вызываю на нем f, мы все знаем, что увидим сообщение «из класса B.»Но есть ли способ для меня осмотреть мой объект и убедиться, что мой подкласс переопределил мой метод?Что-то вроде:

obj = B()
assert(not obj.f.livesIn(A))

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011
class A():
    def f(self):
        print("running function, f from class A")
class B(A):
    def f(self):
        print("running function, f from class B")
class C(A):
    pass

Это показывает, что B.f не равно A.f.Так что B должен переопределить f:

obj = B()
print(obj.__class__.f == A.f)
# False

Это показывает, что C.f равно A.f.Так что C не должно быть переопределено f:

obj = C()
print(obj.__class__.f == A.f)
# True
1 голос
/ 23 сентября 2011

Если вы хотите принудительно переопределить дочерний класс, вы можете raise NotImplementedError().

Выполнение проверки также возможно ... И я вижу, что unutbu только что опубликовал пример, поэтому я не буду повторятьсяЭто.:)

...