Python - Наследование класса композиции - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 2 класса, которые являются композицией. И мне нужно было бы расширить функциональность обоих, поэтому мне нужно было бы использовать наследование от этих базовых классов. Возможно ли это?

class Book:
    def __init__(self):
        self.sheets = generate_sheets()
    author = ''

    def generate_sheets(self):
         for index in range(20):
             (some_extra code)
             self.sheets.append(Sheet(index))

class Sheet:
    def __init__(self, idx):
        self.id = idx

И я хочу создать 2 детей базы, и чтобы композиция была между ними. Было бы возможно только перезаписать метод generate_sheets?

class DefinitionBook(Book):
    def __init__(self):
        super().__init__()
    translator = ''

    def generate_sheets(self):
        super().__init__()
        for index in range(20):
            self.sheets.append(DefSheet(index)

class DefSheet(Sheet):
    def __init__
        super().__init__()
    definition = dict()

Или можно было бы сохранить часть кода метода generate_sheets в дочернем классе Book и изменить только часть, где вызывается класс Sheet / DefSheet?

1 Ответ

0 голосов
/ 03 сентября 2018

У вас может быть класс Sheet (и подклассы), который вам нужно использовать, в качестве переменной класса в классе Book (и подклассах); это отменяет необходимость переопределения generate_sheets в подклассах.

class Sheet:
    def __init__(self, idx):
        self.id = idx
    def __str__(self):
        return f"{self.__class__.__name__}"

class Book:
    sheet = Sheet    
    def __init__(self):
        self.sheets = []
        self.generate_sheets()

    def generate_sheets(self):
        for index in range(20):
            self.sheets.append(self.__class__.sheet(index))

    def __str__(self):
        return f"{self.__class__.__name__} - {self.sheet.__name__}"



class DefSheet(Sheet):
    def __init__(self, idx):
        super().__init__(idx)

class DefinitionBook(Book):
    sheet = DefSheet
    def __init__(self):
        super().__init__()


b = Book()
print(b, b.sheets[0])
d = DefinitionBook()
print(d, d.sheets[0])

Выход:

Book - Sheet Sheet
DefinitionBook - DefSheet DefSheet
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...