Код: Выделить всё
class Parent(object):
__slots__ = ['a','b']
def __init__(self, a:int, b:int):
self.a = a
self.b = b
def myfunc(self,s)->int:
return self.a + s.a
class Child(Parent):
__slots__ = ['c']
def __init__(self, a:int, b:int, c:int):
super().__init__(a,b)
self.c = c
def myfunc(self,s)->int:
return self.a + s.a + s.c
def main():
dad = Parent(1,2)
son = Child(4,8,16)
print(dad.myfunc(son))
print(son.myfunc(son))
print(son.myfunc(dad))
if __name__ == "__main__":
main()
Код: Выделить всё
5
24
Error: Parent has no attribute 'c'
Моя идеальная функциональность для этого кода заключается в том, что я хочу реализовать перегрузку метода. Когда вызывается son.myfunc(dad), я хочу, чтобы он проверял тип папы. Если папа также является дочерним элементом, он должен использовать определение myfunc(), заданное дочерним. В противном случае, если папа не является дочерним элементом, сыну следует вернуться к использованию определения myfunc() в родительском. Итак, для приведенного выше кода мне бы хотелось:
Код: Выделить всё
5
24
5
Код: Выделить всё
class Parent(object):
__slots__ = ['a','b']
def __init__(self, a:int, b:int):
self.a = a
self.b = b
def myfunc(self, s:Parent)->int:
return self.a + s.a
class Child(Parent):
__slots__ = ['c']
def __init__(self, a:int, b:int, c:int):
super().__init__(a,b)
self.c = c
def myfunc(self,s:Child)->int:
return self.a + s.a + s.c
def main():
dad = Parent(1,2)
son = Child(4,8,16)
print(dad.myfunc(son))
print(son.myfunc(son))
print(son.myfunc(dad))
if __name__ == "__main__":
main()
Код: Выделить всё
ParentКак реализовать запланированную функциональность? Есть ли какое-нибудь ключевое слово, например «this» или «self», которое можно использовать для ссылки на текущий тип класса для этих спецификаций? Даже если перегрузка метода не работает таким образом, есть ли способ для одного класса (
Код: Выделить всё
ParentИзменить: я знаю, что типы параметров Python являются аннотациями для удобства чтения и проверки ошибок, и они на самом деле не вызывают ошибок/сбоев, если вызываются с другим типом. Второй сегмент кода был создан, чтобы помочь сообщить, что я хочу, чтобы произошло. Я знаю, что мне, возможно, придется добавить проверку типа isinstance() в начале myfunc, но
(a) я бы хотел избежать этого, если есть альтернатива
(b) если бы я это сделал обнаружив в теле myfunc() дочернего элемента, что вместо этого я хотел бы вызвать родительский, я не уверен, как бы я это сделал.
Подробнее здесь: https://stackoverflow.com/questions/702 ... he-current