python - 如何在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__
。
解决方案
超类不应该依赖于子类,还有其他(更多的 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()
推荐阅读
- python - 如何从以下列表中对总和数字进行排序
- angular - 无法获取空的用户表单
- oracle - Oracle 包和在公共变量中使用 select 语句
- google-cloud-platform - 如何在 Cloud Composer 中重启网络服务器
- javascript - 从 JSON 序列化 BigDecimal、BigNumber、BigInt 等
- python - 有没有办法检测脚本本身中的代码块是否包含特定单词
- c - 尝试读取 json 文件时出现分段错误
- c# - 使用 .NET 的 Google 动态链接
- java - 无法打印数字金字塔
- php - PHP登录和注册表错误处理