为何可通过LemonadeStand类参数调用MenuItem类的get_menuitem_name方法?
问题解答
首先明确两个核心概念:
- 实例方法:像
get_menuitem_name这种定义在类里、第一个参数是self的方法,属于实例方法。这类方法的作用是操作类的实例对象的数据,必须绑定到实例才能正常工作。 - 实例对象:
menu_item是add_menu_item方法的参数,根据代码注释,它就是一个MenuItem类创建出来的实例对象(比如你可能会写lemonade = MenuItem("Lemonade", 0.5, 1.5),这个lemonade就是实例)。
为什么menu_item.get_menuitem_name()是合法的?
当你用**实例对象.方法名()**的方式调用时,Python会自动把这个实例对象作为第一个参数self传递给方法。换句话说,menu_item.get_menuitem_name()等价于MenuItem.get_menuitem_name(menu_item)——Python帮你自动补了self参数,所以能正常获取到这个实例的_name属性。
为什么你的MenuItem.get_menuitem_name()会报错?
你写的x = MenuItem.get_menuitem_name()是错误的,因为直接用类调用实例方法时,Python不会自动传递self参数,你必须手动传入一个MenuItem的实例,比如MenuItem.get_menuitem_name(menu_item)才合法。如果不传,方法里的self就没有值,会抛出TypeError,提示缺少必要的位置参数。
你的代码冗余问题
看你的add_menu_item方法,里面有两行重复的字典赋值:
x = MenuItem.get_menuitem_name() # 这行是错的,会报错 self._menu_dict[x] = menu_item self._menu_dict[menu_item.get_menuitem_name()] = menu_item
第一行代码不仅语法错误,而且完全多余,直接保留第二行就可以完成把MenuItem实例添加到菜单字典的操作。
内容的提问来源于stack exchange,提问作者honggwan
相关产品推荐
相关产品推荐

