Как выполнить часть "__init__" после __init__ подкласса в python? - PullRequest
0 голосов
/ 23 января 2019

У меня есть проблема в Python, которую я считаю теоретически возможным, но, возможно, не на практике. У меня есть класс, который имеет много разных подклассов. Каждый объект из объектов подклассов получает имя на основе некоторых свойств, которые являются уникальными для подкласса. После того, как это имя определено, я хочу, чтобы каждый из них выполнял один и тот же метод, но на основе этого имени. Поэтому я хотел бы поместить это в __init__ родительского класса, но этот бит должен выполняться ПОСЛЕ выполнения подкласса __init__. Я полагаю, что я мог бы вызвать какой-нибудь метод из родительского класса в каждом из подклассов __init__ в конце, но тогда я буду копировать код, и это мне не подходит. Поэтому мне было интересно, есть ли более элегантное решение.

class Cell(object):
    def __init__(self, some_essential_property=1):
        self.some_essential_property = some_essential_property
        # New execute subclass __init__, so that it can make the name
        # Then:
        self.name = self.make_name()
        print(self.name)

    def make_name(self):
        return 'no_special_name'

class Muscle_cell(Cell):
    def __init__(self, strength='huge'):
        super().__init__()
        self.strength = 'huge'

    def make_name(self):
        return 'muscle_with_' + self.strength + '_strength_and_' + str(self.some_essential_property)

M1 = Muscle_cell()

Это вызовет ошибку, потому что сила еще не известна как атрибут. Вот почему я хотел бы выполнить определенные строки сразу после подкласса __init__.

1 Ответ

0 голосов
/ 23 января 2019

Суперкласс не должен зависеть от подкласса, есть и другие (больше способов ООП) делать то, что вы хотите в Python.

import abc

class Cell(object):
    def __init__(self, some_essential_property=1):
        self.some_essential_property = some_essential_property

    @property
    def name(self):
        return self.make_name()

    @abc.abstractmethod
    def make_name(self):
        pass

class Muscle_cell(Cell):
    def __init__(self, strength='huge'):
        super().__init__()
        self.strength = 'huge'

    def make_name(self):
        return 'muscle_with_' + self.strength + '_strength_and_' + str(self.some_essential_property)

M1 = Muscle_cell()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...