如何禁止子类Rentshop实例访问父类bike_shop的show_catalogue方法,现有实现是否正确?
问题解答
一、当前实现的合理性说明
你当前的代码可以正常运行,核心逻辑是通顺的,但存在2个可优化的点:
- 父类的
show_catalogue方法没有用到任何实例属性,完全可以定义为类方法,不需要强制传入self参数,调用更方便 - 子类初始化时调用父类方法可以用
super()代替直接写父类名bike_shop,后续父类改名时不需要修改子类代码,可维护性更强
二、阻止子类实例访问show_catalogue方法的实现方案
常用两种方案,你可以根据需求选择:
方案1:使用Python名称修饰(私有方法)
给父类的show_catalogue方法名前加双下划线__,Python会自动对该方法做名称改写,外部实例(包括子类实例)都无法直接通过原方法名访问,只有父类内部可以正常调用。
方案2:子类重写方法抛出异常
不需要修改父类代码,直接在子类中重新定义和父类同名的show_catalogue方法,调用时直接抛出权限错误即可,示例:
class Rentshop(bike_shop): def __init__(self): # 初始化时调用父类原方法正常生效 self.catalogue = super().show_catalogue() # 重写父类方法,外部调用时抛出异常 def show_catalogue(self): raise PermissionError("该方法不允许外部实例访问")
三、优化后的完整代码示例
这里提供方案1的实现代码,既满足你把目录存为子类属性的需求,也能阻止子类实例直接调用show_catalogue方法:
import pandas as pd import numpy as np class bike_shop: bike_list = [ { "ID": 1, "BikeName": "Bajaj CT 100", "Rent_hour": 139, "Rent_Weekly": 599, "Rent_Monthly": 3339 }, { "ID": 2, "BikeName": "Bajaj CT 100", "Rent_hour": 139, "Rent_Weekly": 599, "Rent_Monthly": 3339 }, { "ID": 3, "BikeName": "Bajaj CT 100", "Rent_hour": 139, "Rent_Weekly": 599, "Rent_Monthly": 3339 }, { "ID": 4, "BikeName": "Bajaj CT 100", "Rent_hour": 139, "Rent_Weekly": 599, "Rent_Monthly": 3339 }, { "ID": 5, "BikeName": "Bajaj CT 100", "Rent_hour": 139, "Rent_Weekly": 599, "Rent_Monthly": 3339 } ] # 加双下划线改为私有方法,仅父类内部可访问 @classmethod def __show_catalogue(cls): df = pd.DataFrame(cls.bike_list) return df class Rentshop(bike_shop): def __init__(self): # 父类内部调用私有方法正常生效 self.catalogue = super().__show_catalogue() x = Rentshop() print(x.catalogue) # 下面这行调用会报错:AttributeError: 'Rentshop' object has no attribute 'show_catalogue' # print(x.show_catalogue()) # 就算写x.__show_catalogue()也会报同样的错,符合需求
内容的提问来源于stack exchange,提问作者Vaibhav Yadav
相关产品推荐
相关产品推荐

