父类类属性未在子类间共享的原因及解决方法咨询
问题原因
Python的类属性继承机制导致了该行为:
- 父类
StandardClass的_my_table是类属性,但子类调用__init__时,cls指向的是子类本身(ClassFoo或ClassBar),而非父类StandardClass。 - 创建
ClassFoo实例时,ClassFoo._my_table先继承父类的None,赋值操作会给ClassFoo自身添加一个同名类属性,与父类的_my_table完全独立。 - 创建
ClassBar实例时,ClassBar._my_table依然继承父类的None,因此会再次触发SQL读取操作。
解决方案
要让所有子类共享同一份_my_table数据,直接操作父类的类属性即可,修改父类的__init__方法:
from abc import ABC import pandas as pd class StandardClass(ABC): _my_table = None _connection = None # 假设已正确初始化数据库连接 @classmethod def __init__(cls): if StandardClass._my_table is not None: return # 直接修改父类的_my_table属性,实现子类共享 StandardClass._my_table = pd.read_sql(_my_table_query(), cls._connection) # 此处定义抽象方法
修改后,无论哪个子类调用初始化方法,都会检查父类的_my_table状态,第一次赋值完成后,所有后续子类实例化都会跳过SQL读取操作。
若_connection也是所有子类共享的资源,同样可以改为StandardClass._connection,确保统一使用父类的连接配置。
内容的提问来源于stack exchange,提问作者RDGuida
相关产品推荐
相关产品推荐

