You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止子类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:18:04