我在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__
之后立即执行某些行。
答案 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()