Python内部类能否继承外部类?移动端网站标签页架构实现求助
解决内部类继承外部类及禁止直接实例化外部类的问题
方案1:忽略IDE提示,直接使用内部类继承外部类(Python运行无问题)
Python本身支持内部类继承外部类,虽然PyCharm会有静态检查提示,但实际代码可正常运行。同时在外部类的__init__中添加判断,禁止直接实例化外部类:
class Website: def __init__(self): # 禁止直接实例化Website类 if type(self) is Website: raise TypeError("请勿直接实例化Website,请使用Website.A/B/C") def common_method(self): # 通用方法示例 print("执行通用逻辑") class A(Website): def a_tab_method_only(self): print("执行A标签页专属逻辑") class B(Website): def b_tab_method_only(self): print("执行B标签页专属逻辑") class C(Website): def c_tab_method_only(self): print("执行C标签页专属逻辑")
使用方式:
# 正确用法:实例化内部类 tab_a = Website.A() tab_a.common_method() # 调用通用方法 tab_a.a_tab_method_only() # 调用A标签页专属方法 # 错误用法:直接实例化Website会抛出异常 # website = Website() # 触发TypeError
如果需要无需实例化的类方法调用,可将方法改为@classmethod:
class Website: def __init__(self): if type(self) is Website: raise TypeError("请勿直接实例化Website,请使用Website.A/B/C") @classmethod def common_method(cls): print("执行通用类方法") class A(Website): @classmethod def a_tab_method_only(cls): print("执行A标签页专属类方法") # 直接调用类方法 Website.A.common_method() Website.A.a_tab_method_only()
方案2:抽离通用方法到基类,解决IDE识别问题
如果不想忽略IDE的静态提示,可将通用方法抽成独立基类,让外部类和内部类都继承该基类,彻底避免检查问题:
# 通用方法基类 class WebsiteCommon: def common_method(self): print("执行通用逻辑") @classmethod def common_class_method(cls): print("执行通用类方法") class Website(WebsiteCommon): def __init__(self): if type(self) is Website: raise TypeError("请勿直接实例化Website,请使用Website.A/B/C") # 内部类直接继承通用基类 class A(WebsiteCommon): def a_tab_method_only(self): print("执行A标签页专属逻辑") class B(WebsiteCommon): def b_tab_method_only(self): print("执行B标签页专属逻辑") class C(WebsiteCommon): def c_tab_method_only(self): print("执行C标签页专属逻辑")
这种方式既保留了通用方法的复用,又解决了PyCharm无法识别父类的问题,同时不会产生循环导入。
两种方案均满足你的需求:内部类封装各标签页逻辑、复用通用方法、禁止直接使用外部类,可根据是否在意IDE提示选择。
内容的提问来源于stack exchange,提问作者user2678074
相关产品推荐
相关产品推荐

