Как сделать объект родительского класса ссылающимся на дочерний класс? - PullRequest
0 голосов
/ 27 апреля 2020

Как в java или C#, где мы можем создать объект, подобный

Account obj = new SavingsAccount();

, где Account - родительский класс, а SavingsAccount - дочерний класс

Как мне сделать то же самое с python?

В основном я пытаюсь сделать это https://repl.it/@MushfiqurRahma1 / Polymorphi c -Объект

Ответы [ 3 ]

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

Python динамически типизируется: имена относятся к объектам без какого-либо представления о типе. У вас просто есть

>>> class Account: pass
...
>>> class SavingsAccount(Account): pass
...
>>> obj = SavingsAccount()

Каждый объект хранит ссылку на свой собственный тип

>>> type(obj)
<class '__main__.SavingsAccount'>

, и каждый тип имеет ссылку на свой порядок разрешения методов (MRO)

>>> type(obj).__mro__
(<class '__main__.SavingsAccount'>, <class '__main__.Account'>, <class 'object'>)

Атрибуты экземпляра не «разделены» в соответствии с классом, который «определяет» их; каждый атрибут просто существует в самом экземпляре, без ссылки на какой-либо конкретный класс.

Методы существуют исключительно в самих классах; когда приходит время для вызова obj.foo(), MRO используется для определения, чье определение используется.

0 голосов
/ 27 апреля 2020

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

class Account():
    def deposit():
        pass
class SavingsAccount(Account):
    pass

obj = SavingsAccount()
obj.deposit(20)

РЕДАКТИРОВАТЬ : Как chepner указал: Python is strongly typed, but also dynamically typed: type is associated with an object, not the name referring to an object.

0 голосов
/ 27 апреля 2020

Python использует типизацию Duck, что означает, что вам не нужно заботиться о классе в левой части задания. Просто создайте экземпляр класса Child, и вы уже сможете использовать его родительский «интерфейс» для таких вещей, как динамические c вызовы методов.

...