Python. Использование супер конструктора. Как сделать так, чтобы при создании экземпляра класса требовалось ввести атрибуты дочернего и род. класса?
Имеется два класса (дочерний и родительский). В обоих определены конструкторы.
Как написать конструктор дочернего класса, чтобы при создании его экземпляра требовалось вводить как атрибуты дочернего, так и родительского? И возможно ли это вообще?
class Transport:
def __init__(self, weight, fuelType, bodyColor, maxSpeed, engineCapacity, mileage, acelerationFrom0To100, enginePower):
self.weight = weight
self.fuelType = fuelType
self.bodyColor = bodyColor
self.maxSpeed = maxSpeed
self.engineCapacity = engineCapacity
self.mileage = mileage
self.acelerationFrom0To100 = acelerationFrom0To100
self.enginePower = enginePower
class PassengerCar(Transport):
def __init__(self, countOfPassengerSeats, trunkVolume, interiorColor):
Transport().__init__() # это не помогает....
self.countOfPassengerSeats = countOfPassengerSeats
self.trunkVolume = trunkVolume
self.interiorColor = interiorColor
Ответы (2 шт):
Реализуйте доступ к родительскому классу через super, а не через имя этого класса. Это, как минимум, удобнее. В примере ниже все значения атрибутов одноименны их названиям.
# Date: October 26th, 2020.
class Transport:
def __init__(self, weight, fuelType, bodyColor, maxSpeed,
engineCapacity, mileage, acelerationFrom0To100,
enginePower):
self.weight = weight
self.fuelType = fuelType
self.bodyColor = bodyColor
self.maxSpeed = maxSpeed
self.engineCapacity = engineCapacity
self.mileage = mileage
self.acelerationFrom0To100 = acelerationFrom0To100
self.enginePower = enginePower
class PassengerCar(Transport):
def __init__(self, countOfPassengerSeats, trunkVolume,
interiorColor, *args):
super().__init__(*args)
self.countOfPassengerSeats = countOfPassengerSeats
self.trunkVolume = trunkVolume
self.interiorColor = interiorColor
attributes=(
"countOfPassengerSeats", "trunkVolume", "interiorColor",
"weight", "fuelType", "bodyColor", "maxSpeed", "engineCapacity",
"mileage", "acelerationFrom0To100", "enginePower")
obj=PassengerCar(*attributes)
for attribute in dir(obj):
if attribute in attributes:
print(f"<attribute '{attribute}': '{getattr(obj, attribute)}'>")
Как написать конструктор дочернего класса, чтобы при создании его экземпляра требовалось вводить как атрибуты дочернего, так и родительского?
Принимать в методе __init__ дочернего класса аргументы для родительского класса. Тогда при создании экземпляра дочернего класса нужно будет обеспечить аргументы для обоих методов __init__ - родительского и дочернего.
class PassengerCar(Transport):
def __init__(self,
# Аргументы родительского класса
weight, fuelType, bodyColor,
maxSpeed, engineCapacity, mileage,
acelerationFrom0To100, enginePower,
# Аргументы дочернего класса
countOfPassengerSeats, trunkVolume, interiorColor):
# Передаём родительскому классу его аргументы
super().__init__(weight, fuelType, и т. д.)
Пример:
class Parent:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
class Child(Parent):
def __init__(self, a, b, c, d, e):
# Вызываем родительский "__init__" и передаём ему его аргументы
super().__init__(a, b, c)
self.d = d
self.e = e
# При создании объекта передаём аргументы для двух методов "__init__":
# первые три для родительского,
# последние два для дочернего
obj = Child(1, 2, 3, 4, 5)
from pprint import pprint
# Атрибуты объекта хранятся в словаре __dict__, проверяем его содержимое
pprint(obj.__dict__, width=20)
Начиная с Python 3.7 можно автоматизировать создание атрибутов с помощью dataclass:
from dataclasses import dataclass
@dataclass
class Parent:
a: int
b: int
c: int
@dataclass
class Child(Parent):
d: int
e: int
obj = Child(1, 2, 3, 4, 5)
from pprint import pprint
pprint(obj.__dict__, width=20)