鱼C论坛

 找回密码
 立即注册
查看: 1775|回复: 4

[已解决]Python第2版(第146页)例子代码问题

[复制链接]
发表于 2023-7-7 09:39:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正在学习类和对象,对于11.3.2中的例子有一个疑问,希望有大神能解答下:
class Potato:
        def _ _init_ _(self,name):
                   self.name = name
        def  kick(self):
               print("我叫%s,嗷~谁踢我?!"% self.name)

请问为什么def kick(self)中不需要name参数了呢?
最佳答案
2023-7-7 09:44:56
当我们定义一个类时,我们可以在类中定义各种方法来操作和访问对象的属性。在Python中,类的方法的第一个参数通常是self,它代表类实例本身。

在这个例子中,我们定义了一个名为Potato的类。该类有两个方法:__init__()和kick()。

__init__() 方法是一个特殊方法,在创建一个类的实例时会自动调用。它用于初始化对象的属性和执行其他必要的操作。在这个例子中,我们通过 __init__() 方法来初始化 Potato 类的 name 属性。

__init__() 方法接受两个参数:self 和 name。其中,self 表示当前类的实例对象,name 是我们传入的参数。通过 self.name = name 这一语句,我们将传入的 name 参数赋值给实例对象的 name 属性。

接下来,我们看到 kick() 方法。这个方法没有显式地传入 name 参数,而是通过 self.name 来获取实例对象的 name 属性值。

在 Python 中,类的方法访问实例属性时,需要使用 self.属性名 的方式。self 代表当前实例对象本身,通过 self 可以访问实例的属性和方法。

所以,当我们创建一个 Potato 实例对象并命名为 potato,比如 potato = Potato("小土豆"),在这里我们将 "小土豆" 作为参数传递给 __init__() 方法,并且该参数会被保存到实例的 name 属性中。

当我们调用 potato.kick() 方法时,kick() 方法内部可以通过 self.name 访问到实例对象的 name 属性值。这样,方法就能够打印出相应的结果:"我叫小土豆,嗷~谁踢我?!"。

所以,在 kick() 方法中不需要显式地传入 name 参数,而是通过 self.name 间接地访问实例对象的属性值。这样,我们可以方便地在类的其他方法中使用实例的属性。

如果输入:
p = Potato('Lucy')

name的属性值就是
Lucy

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 09:39:49 | 显示全部楼层
在这个例子中, Potato  类有一个构造方法  __init__  和一个名为  kick  的方法。在构造方法中,我们传递了一个名为  name  的参数,用于初始化  Potato  对象的  name  属性。这意味着当我们创建一个  Potato  对象时,我们需要为它提供一个名字。

当我们调用  kick  方法时,我们不需要再传递  name  参数,因为  Potato  对象已经在创建时接收了名字并将其存储在  self.name  属性中。 self  参数允许我们在类的其他方法中引用对象的属性和方法。因此,在  kick  方法中,我们可以直接使用  self.name  访问之前创建对象时设置的名字,无需再次传递  name  参数。

举个例子,当我们创建一个  Potato  对象并调用其  kick  方法时,代码如下:
p1 = Potato("Tom")p1.kick()
这将输出:
我叫Tom,嗷~谁踢我?!
在这个例子中,我们在创建  Potato  对象时传递了名字 "Tom"。因此,在调用  kick  方法时, self.name  的值为 "Tom",无需再传递  name  参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 09:42:23 | 显示全部楼层
self 在类的方法中表示实例自己。当你创建一个类的实例并调用其方法时,Python会自动把这个实例作为第一个参数传递。在你的代码中,当你创建一个 Potato 类的实例时,你会提供一个 name 参数,这个参数被用在 __init__ 方法中来初始化实例的 name 属性。

例如:
p = Potato('Tom')

在这个例子中, Tom 被作为 name 参数传递给 __init__ 方法,然后被赋值给实例的 name 属性。因此,这个实例的 name 属性值就是'Tom'。

当你调用实例的 kick 方法时,如 p.kick() ,你不需要再次提供 name 参数。这是因为 kick 方法可以通过 self.name 访问到实例的 name 属性。

在 kick 方法中, self.name 就是'Tom',因此 kick 方法中的 print 语句会打印 "我叫Tom,嗷~谁踢我?!"。总的来说, self 关键字可以让类的方法访问和操作实例的属性,所以 kick 方法不需要 name 参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 09:44:56 | 显示全部楼层    本楼为最佳答案   
当我们定义一个类时,我们可以在类中定义各种方法来操作和访问对象的属性。在Python中,类的方法的第一个参数通常是self,它代表类实例本身。

在这个例子中,我们定义了一个名为Potato的类。该类有两个方法:__init__()和kick()。

__init__() 方法是一个特殊方法,在创建一个类的实例时会自动调用。它用于初始化对象的属性和执行其他必要的操作。在这个例子中,我们通过 __init__() 方法来初始化 Potato 类的 name 属性。

__init__() 方法接受两个参数:self 和 name。其中,self 表示当前类的实例对象,name 是我们传入的参数。通过 self.name = name 这一语句,我们将传入的 name 参数赋值给实例对象的 name 属性。

接下来,我们看到 kick() 方法。这个方法没有显式地传入 name 参数,而是通过 self.name 来获取实例对象的 name 属性值。

在 Python 中,类的方法访问实例属性时,需要使用 self.属性名 的方式。self 代表当前实例对象本身,通过 self 可以访问实例的属性和方法。

所以,当我们创建一个 Potato 实例对象并命名为 potato,比如 potato = Potato("小土豆"),在这里我们将 "小土豆" 作为参数传递给 __init__() 方法,并且该参数会被保存到实例的 name 属性中。

当我们调用 potato.kick() 方法时,kick() 方法内部可以通过 self.name 访问到实例对象的 name 属性值。这样,方法就能够打印出相应的结果:"我叫小土豆,嗷~谁踢我?!"。

所以,在 kick() 方法中不需要显式地传入 name 参数,而是通过 self.name 间接地访问实例对象的属性值。这样,我们可以方便地在类的其他方法中使用实例的属性。

如果输入:
p = Potato('Lucy')

name的属性值就是
Lucy

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 10:08:10 | 显示全部楼层
感谢楼上各位大神的回答,使我茅塞顿开。答案都很好,可惜最佳只能给一个,再次感谢各位大神的答疑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 06:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表