python - 当使用西蒙课程时,我给出了两个论点,一个是自我,另一个是健全的。但是,当我使用列表时,我必须给出 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'))
解决方案
我认为您的答案格式可能存在错误,这使阅读有点困难,但我会尝试回答:)
问题是这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
尚未定义该方法。
如果不清楚,请不要犹豫:)
推荐阅读
- flutter - 来自 OneSignal 的通知和来自动态链接空白页的链接
- jwt - Microsoft Graph API - AuthenticationError:使用资源进行身份验证时出错
- sql - 如何在 Oracle 的 SQL 中打印模式输出
- spring-security - Thymeleaf 无法显示用户的用户名和角色
- amazon-web-services - 查找最新的 Ubuntu 20.04 AMI-ID 以使用 AWS-CLI 启动一个简单的微实例
- python - Pyvista:找出选择了哪个网格
- python - Python:试图了解 `lambda`s 如何与外部作用域交互
- javascript - 如何在 JavaScript 中过滤 DOMRange
- git - 在 Azure Devops 中创建分支时对作者的说明
- wix - 小升级 - 删除它时,如何卸载“原始”msi