如何在python子类的__init__之后执行“ __init__”的一部分?

时间:2019-01-23 20:43:46

标签: python oop

我在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 :(得分:1)

超类不应该依赖于子类,还有其他(更多的OOP方法)可以在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()