首页 > 解决方案 > 如何在python中子类的__init__之后执行部分“__init__”?

问题描述

我在 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()

这将引发错误,因为强度还不是一个属性。这就是为什么我想在 subclass 之后立即执行某些行__init__

标签: pythonoop

解决方案


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

推荐阅读