То, что вы ищете здесь, не имеет ничего общего с созданием экземпляра. Это слово означает создание экземпляра класса. Вы не можете "создать экземпляр дочернего класса из родительского класса", потому что объект класса не является (за исключением очень необычных обстоятельств) экземпляром его базового класса.
То, что вы пытаетесь сделать, это устранить какой-то шаблон.
Python очень гибок - экземпляры могут определять атрибуты там, где они хотят, классы могут иметь любую сигнатуру для таких методов, как __init__
и __repr__
и т. Д. Это очень мощно, но это также означает, что когда у вас есть очень повторяющаяся иерархия классов, вам приходится много повторяться. Но, поскольку Python очень гибок, вы можете написать инструменты для генерации всего этого повторяющегося материала или просто использовать инструменты, поставляемые с языком, например @dataclass
: 1
from dataclasses import dataclass
@dataclass
class Parent:
a: int
b: int
c: int
d: int
e: int
f: int
g: int
h: int
@dataclass
class Child1(Parent):
i: int
j: int
k: int
@dataclass
class Child2(Parent):
x: int
y: int
z: int
Это все, что нужно для определения ваших классов, включая автоматическую генерацию __init__
методов, которые могут обрабатывать как позиционные, так и ключевые аргументы и направлять нужные вещи в базовые классы, и __repr__
методов, которые отображают вещи некоторым полезным способом, и Статический тип подсказывает, что Mypy может проверить вас и так далее, без повторов:
>>> c1 = Child1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
>>> c1
Child1(a=1, b=2, c=3, d=4, e=5, f=6, g=7, h=8, i=9, j=10, k=11)
>>> c1b = Child1(1, 2, 3, 4, 5, 6, 7, k=11, j=10, h=8, i=9)
>>> c1 == c1b
True
>>> c2 = Child2(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
>>> c1 == c2
False
Если вы прочитаете документы, то увидите, что там гораздо больше гибкости (и даже больше в attrs
), но значения по умолчанию дают вам то, что вы хотите, 80% времени.
@dataclass
был добавлен в Python 3.7. Существует бэкпорт для 3,6 , который вы можете установить только с pip install dataclasses
, но если вам нужно работать с 3,5 или 2,7, вам понадобится сторонняя библиотека, такая как attrs
вместо. Также посмотрите на namedtuple
для очень простых случаев, которые работают вплоть до 2.6 и 3.1.