Python: как указать тип параметра функции класса для текущего класса?Python

Программы на Python
Anonymous
Python: как указать тип параметра функции класса для текущего класса?

Сообщение Anonymous »

Я пишу набор пользовательских классов с наследованием, используя Python. Вот упрощенный код:

Код: Выделить всё

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'
Определение myfunc() в Child требует, чтобы оба self AND были экземплярами Child.
Моя идеальная функциональность для этого кода заключается в том, что я хочу реализовать перегрузку метода. Когда вызывается son.myfunc(dad), я хочу, чтобы он проверял тип папы. Если папа также является дочерним элементом, он должен использовать определение myfunc(), заданное дочерним. В противном случае, если папа не является дочерним элементом, сыну следует вернуться к использованию определения myfunc() в родительском. Итак, для приведенного выше кода мне бы хотелось: Я думал, что смогу реализовать эту функциональность следующим образом, указав типы параметров myfunc():

Код: Выделить всё

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()
Однако это не работает. Python и моя IDE сообщают мне, что «Родительский элемент не определен» к тому моменту, когда я использую его для указания типа ввода родительской функции myfunc(), и то же самое для Дочернего элемента. Кажется, я понимаю, о чем он говорит ('' ничего не будет означать, пока компилятор не завершит чтение Parent, поэтому его нельзя указать в качестве типа параметра), но я не знаю, как это обойти.
Как реализовать запланированную функциональность? Есть ли какое-нибудь ключевое слово, например «this» или «self», которое можно использовать для ссылки на текущий тип класса для этих спецификаций? Даже если перегрузка метода не работает таким образом, есть ли способ для одного класса (), чтобы указать себя в качестве типа параметра одной из своих функций?
Изменить: я знаю, что типы параметров Python являются аннотациями для удобства чтения и проверки ошибок, и они на самом деле не вызывают ошибок/сбоев, если вызываются с другим типом. Второй сегмент кода был создан, чтобы помочь сообщить, что я хочу, чтобы произошло. Я знаю, что мне, возможно, придется добавить проверку типа isinstance() в начале myfunc, но
(a) я бы хотел избежать этого, если есть альтернатива
(b) если бы я это сделал обнаружив в теле myfunc() дочернего элемента, что вместо этого я хотел бы вызвать родительский, я не уверен, как бы я это сделал.

Подробнее здесь: https://stackoverflow.com/questions/702 ... he-current

Вернуться в «Python»