bio911 发表于 2023-7-7 09:39:05

Python第2版(第146页)例子代码问题

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

请问为什么def kick(self)中不需要name参数了呢?

陶远航 发表于 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参数。

isdkz 发表于 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 参数。

sfqxx 发表于 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

求最佳答案

bio911 发表于 2023-7-7 10:08:10

感谢楼上各位大神的回答,使我茅塞顿开。答案都很好,可惜最佳只能给一个,再次感谢各位大神的答疑。
页: [1]
查看完整版本: Python第2版(第146页)例子代码问题