首页 > 解决方案 > 当使用西蒙课程时,我给出了两个论点,一个是自我,另一个是健全的。但是,当我使用列表时,我必须给出 1 个参数,这是为什么?**

问题描述

类 Cat(): is_lazy = True

def __init__(self, name, age):
    self.name = name
    self.age = age

def walk(self):
    return f'{self.name} is just walking around'

西蒙类(猫):def sing(自我,声音):返回f'{sounds}'

类 Sally(Cat): def sing(self,sounds): return f'{sounds}'

栗色类(猫):def sing(自我,声音):返回f'{sounds}'

my_cats = [Simon('simon', 4), Sally('sally', 3), Maroon('maroon', 2)] print(Simon.sing(Simon, 'meow')) for caty in my_cats:

print(f'this is {caty.name} ', caty.sing('meowww'))

标签: pythonoopparametersargumentsself

解决方案


我认为您的答案格式可能存在错误,这使阅读有点困难,但我会尝试回答:)

问题是这Simon是一个类,而您列表中的所有猫都是您的类的实例

为了更清楚,"meowww"str:str是一个类而"meowww"是类的实例之间的区别是相同的str

关键字self实际上是指类的实例。当您实例化一个对象时,它会调用该方法__init__并返回一个类型为 的对象Simon,其中包含在 中定义的所有属性__init__

在你的情况下,你会这样做simon = Simon("simon", 4),然后你就只能写simon.sing("meowww"),因为函数中的单词self会自动引用你的对象simon,它的类型是Simon

但是,当您直接通过编写使用它时Simon.sing("meowww"),您还没有创建任何类的对象Simon。所以这个词self不能指代任何东西,你必须自己提供。

您的情况很幸运:在您的 functionsing中,您不使用 to self。因此,您可以提供任何东西,并且该功能无论如何都可以正常工作(自己尝试:))。但是,如果您按以下方式修改函数sing,则会遇到问题:

class Simon(Cat):
    def sing(self, sounds): return f'{self.name} says: {sounds}'

AttributeError: type object "Simon" has no attribute "name"当您尝试让 Simon 唱歌时,它会产生一个,因为您提供self的是Simon. Simon并且由于尚未实例化该类,__init__因此尚未调用该方法并且self.name尚未定义该方法。

如果不清楚,请不要犹豫:)


推荐阅读