这名字没人用吧?
2021-08-26 19:24
采纳率: 100%
浏览 51
已结题

Python 3.9.6中子类方法中使用for循环遍历列表,循环只执行一次打印出整个列表

调用子类方法,方法中使用for循环遍历元组,循环只执行一次打印出元组,不是预想的单个元素打印的效果。

代码
父类相关代码


class Restaurant:
    """餐馆的描述与营业状态"""

    def __init__(self, restaurant_name, cuisine_type):
        """初始化属性restaurant_name和cuisine_type"""
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number_served = 8

    def describle_restaurant(self):
        """描述餐馆的信息"""
        print(f'The restaurant name is {self.restaurant_name}.')
        print(f'There are {self.number_served} persons visited '
              f'{self.restaurant_name}.')
        print(f"{self.restaurant_name}'s type is {self.cuisine_type}.")

创建子类代码

class IceCreamStand(Restaurant):
    """冰淇淋子类继承餐馆父类"""

    def __init__(self, restaurant_name, cuisine_type, *flavors):
        """
        初始化父类属性,再初始化子类属性
        """
        super().__init__(restaurant_name, cuisine_type)
        self.flavors = flavors

    def show_ice(self):
        print(f"\nThe following is the kind of this icecream:")
        for flavor in self.flavors:
            print(f'{flavor}')


方法调用

kind = ('香草', '蓝莓', '柠檬', '西瓜', '草莓', '猫屎')
re = IceCreamStand('蜜雪冰城', '冰淇淋', kind)
re.describle_restaurant()
re.show_ice()

show_ice()是子类特有的方法,
执行结果

img
尝试解决,修改子类方法

def __init__(self, restaurant_name, cuisine_type):
        """
        初始化父类属性,再初始化子类属性
        """
        super().__init__(restaurant_name, cuisine_type)
        self.flavors = []

直接使用实例re.flavors = kind 传入实参得到预期结果

img
疑惑是为什么第一种方式不可以,是因为初始化父类属性时不能直接在_init_()方法中添加子类属性(不能的话,但是实参能传进去)。

  • 收藏

3条回答 默认 最新

  • 已采纳
    你子类代码中
    
        def __init__(self, restaurant_name, cuisine_type, *flavors):
    
    *flavors是把剩余参数打包形成一个元组,而你调用时传的kind也是一个元组
    flavors就成了一个嵌套二层的元组
    ( ('香草', '蓝莓', '柠檬', '西瓜', '草莓', '猫屎'),)
    
    
    需要在调用时用*kind把这个元组拆解开
    
        re = IceCreamStand('蜜雪冰城', '冰淇淋', *kind)
    
    或者 子类代码 *flavors改成flavors 直接接受kind元组
        def __init__(self, restaurant_name, cuisine_type, flavors):
    
    
    
    已采纳该答案
    1 打赏 评论
  • CSDN专家-showbo 2021-08-26 20:17

    *flavors是可变参数,调用时要用 * 展开,要不整个tuple作为flavors的一个项

    
    kind = ('香草', '蓝莓', '柠檬', '西瓜', '草莓', '猫屎')
    re = IceCreamStand('蜜雪冰城', '冰淇淋', *kind)#要展开
    re.describle_restaurant()
    re.show_ice()
    
    

    有帮助麻烦点个采纳【本回答右上角】,谢谢~~

    1 打赏 评论
  • 咕泡-三木 2021-08-26 19:30

    注意子类的细节

        def __init__(self, restaurant_name, cuisine_type, *flavors):
    

    *flavors改成flavors就好了

    1 打赏 评论

相关推荐 更多相似问题