Не хватает знаний для создания класса. Помогите пожалуйста!

Написал такой класс:

class Sun:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.c = None
        self.d = None

    def sunset(self):
        self.c = 'sunset'
        return self.calc()

    def sunrise(self):
        self.c = 'sunrise'
        return self.calc()

    def official(self):
        self.d = 'official'
        return self.calc()

    def civil(self):
        self.d = 'civil'
        return self.calc()

    def calc(self):
        x = self.a + self.b + self.c + self.d
        return x

Вкратце что мне нужно. Создать экземпляр со значениями a и b.

sun = Sun('a', 'b')

Путем вызова функции получить вычисленное значение из метода calc, чтобы получился типа такой запрос со следующим значением:

print(sun.sunrise.civil())  # вывод: absunrisecivil
print(sun.sunrise.official())  # вывод: absunriseofficial
print(sun.sunset.official())  # вывод: absunsetofficial

Важный момент это то, что sunset и sunrise не должен ничего возвращать самостоятельно, а только со значением либо civil, либо official.

из sun может быть вызван только sunset или sunrise

из sunset может быть вызван только civil и official

из sunrise может быть вызван только civil и official

Описал проблему как мог ))) Подскажите пожалуйста, как реализовать?


Ответы (3 шт):

Автор решения: Alex Bond

Сделай Sun родительским а sunset и sunrise наследниками. И потом просто вызывай тот или тот класс с параметрами. Если в условия нет что должен быть только 1 класс.

class Sun:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.c = None
        self.d = None

    def official(self):
        self.d = 'official'
        return self.calc()

    def civil(self):
        self.d = 'civil'
        return self.calc()

    def calc(self):
        return self.a + self.b + self.c + self.d

class Sunset(Sun):
    def __init__(self, a, b):
        super().__init__(a, b)
        self.c = 'sunset'

class Sunrise(Sun):
    def __init__(self, a, b):
        super().__init__(a, b)
        self.c = 'sunrise'

sunset = Sunset('a', 'b')
sunrise = Sunrise('a', 'b')

print(sunset.civil())
print(sunrise.official())
→ Ссылка
Автор решения: Швеев Алексей

По хорошему конечно стоит создать 2 класса:

class SunPos:
  def __init__(self, sun, pos):
    self.startWith = f'{sun.a}{sun.b}{pos}'
  
  def civil(self):
    return f'{self.startWith}civil'
  
  def offical(self):
    return f'{self.startWith}offical'


class Sun:
  def __init__(self, a, b):
    self.a = a; self.b = b
    self.sunrise = SunPos(self, "sunrise")
    self.sunset = SunPos(self, "sunset")

Таким образом ваши примеры работают корректно

→ Ссылка
Автор решения: Smopuim_81

Вот код, которые работает как нужно:

class SunPos:
    def __init__(self, sun, pos):
        self.a = sun.a
        self.b = sun.b
        self.c = pos
        self.d = None

    def civil(self):
        self.d = 10
        return self.calc()

    def offical(self):
        self.d = 20
        return self.calc()

    def calc(self):

        return self.a * self.b * self.c * self.d


class Sun:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.sunrise = SunPos(self, 1)
        self.sunset = SunPos(self, 15) 
 
x = Sun(10, 5)  
print(x.sunrise.offical())  # Вывод: 1000
→ Ссылка