继承DataBuilder的多实例会重复构建数据库吗?如何避免?
问题解答
1. 是否会触发三次数据库构建?
是,会触发三次数据库构建。原因很直接:每创建一个子类实例时,都会调用父类DataBuilder的__init__方法,而这个方法里直接执行了self.build(),三个实例会分别触发一次build,总共三次。
2. 实现仅构建一次的方案
下面提供几种实用的实现方式:
方式一:用类属性标记构建状态
给DataBuilder添加一个类级别状态标记,所有子类共享这个标记,只有未完成构建时才执行数据库逻辑:
class DataBuilder: _has_built = False # 类属性,记录是否已构建 def __init__(self): self.build() def build(self): if not DataBuilder._has_built: # 这里编写数据库构建逻辑 print("数据库构建完成") DataBuilder._has_built = True class StrategyOne(DataBuilder): def __init__(self): super().__init__() class StrategyTwo(DataBuilder): def __init__(self): super().__init__() class StrategyThree(DataBuilder): def __init__(self): super().__init__() # 测试效果 strategy_one = StrategyOne() # 输出:数据库构建完成 strategy_two = StrategyTwo() # 无输出 strategy_three = StrategyThree() # 无输出
方式二:提前执行类级别的构建逻辑
把构建逻辑改成类方法,在创建实例前手动执行一次,后续子类实例化时不再重复构建:
class DataBuilder: @classmethod def build_db(cls): # 编写数据库构建逻辑 print("数据库构建完成") # 提前执行一次构建 DataBuilder.build_db() class StrategyOne(DataBuilder): def __init__(self): super().__init__() # 后续创建实例不会触发构建 strategy_one = StrategyOne() strategy_two = StrategyTwo() strategy_three = StrategyThree()
方式三:复用单例化的数据库实例
如果数据库本身是单例需求,可以把构建好的数据库实例存在类属性中,所有子类实例直接复用这个实例:
class DataBuilder: _db_instance = None def __init__(self): self.db = self._get_db_instance() def _get_db_instance(self): if not DataBuilder._db_instance: # 构建数据库并生成实例 print("构建数据库实例") DataBuilder._db_instance = "模拟数据库实例对象" return DataBuilder._db_instance class StrategyOne(DataBuilder): pass # 可省略__init__,自动继承父类逻辑 # 测试:所有实例共享同一个数据库对象 s1 = StrategyOne() s2 = StrategyTwo() print(s1.db is s2.db) # 输出:True
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

