Python-合成类的继承

时间:2018-09-03 06:50:34

标签: python python-3.x class oop inheritance

我有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 :(得分:4)

您可以将需要使用的类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