Я хочу, чтобы не нужно повторно указывать родительские атрибуты объекта при добавлении атрибутов из дочернего класса - PullRequest
1 голос
/ 05 апреля 2019

Итак, у меня есть набор данных звезд, для которого я создаю класс (Звезда). И из этих звезд некоторые из них являются переменными звездами. Я создал дочерний класс (Variable), но когда я определяю, что один из моих объектов Star является переменной star (код не включен), я хочу включить дополнительную информацию в этот же объект без необходимости заново определять старую информацию и дополнительно классифицировать объект в дочерний класс.

Я знаю, что смогу заставить его работать, если сделаю что-то вроде этого:

# Class attribute
category = 'variable'

# Initializer / Instance attributes
def __init__(self, name, coordinates, scatter, photometry, periods, amplitudes):

и затем:

star1 = Variable('Star 1', ('RA', 'dec'), 0.1, np.sin(np.linspace(0,1,100)), [1,100,1000], [1,2,1])

Но я не хочу уточнять всю эту информацию.

# Parent class
    class Star:

    # Class attribute
    category = 'TESS'

# Initializer / Instance attributes
def __init__(self, name, coordinates, scatter):
    self.name = name
    self.coordinates = coordinates
    self.scatter = scatter

star1 = Star('Star 1', ('RA', 'dec'), 0.1)
print('Parent class')
print('category    :', star1.category)
print('name        :', star1.name)
print('coordinates :', star1.coordinates)
print('scatter     :', star1.scatter, '\n')

# Child class (inherits from Star() class)
class Variable(Star):

    # Class attribute
    category = 'variable'

    # Initializer / Instance attributes
    def __init__(self, photometry, periods, amplitudes):
        self.photometry = photometry
        self.periods = periods
        self.amplitudes = amplitudes

star1 = Variable(np.sin(np.linspace(0,1,100)), [1,100,1000], [1,2,1])
print('Child class')
print('category   :', star1.category)
print('photometry :', star1.photometry)
print('periods    :', star1.periods)
print('amplitudes :', star1.amplitudes)

Код ниже работает как ожидалось. Но если я попробую:

print(star1.name)

после

star1 = Variable(np.sin(np.linspace(0,1,100)), [1,100,1000] [1,2,1])

имя, координаты и разброс, похоже, удалены из моего объекта.

1 Ответ

1 голос
/ 05 апреля 2019

Вы должны вызвать метод инициализации суперкласса, иначе он никогда не запустится!Другими словами, метод __init__ класса Star не будет запущен, пока вы не скажете ему.

class Variable(Star):
    def __init__(self, arg1, arg2):
        super().__init__(arg1)
        self.arg2 = arg2

super() - это способ доступа к суперклассу и его методам.Скажем, у вас есть метод merge в классе Star, который объединил две звезды, и вы хотите вызвать его из класса Variable, вы бы назвали super().merge(other_star).

...