纪叶 发表于 2024-4-12 11:10:13

定义类,在构造法中对类属性进行加一操作

题目:定义一个雁类Geese,并在该类中定义4个类属性,前三个用于记录雁类的特征,第4个用于记录实例编号,然后定义一个构造方法,在该构造方法中将记录实例编号的类属性进行加1操作,并输出4个类属性的值,最后通过for循环创建4个雁类的实例。


我的代码:

class Geese:
    def __init__(self, rating):
      self.name = '大雁'
      self.feature = '体型大,喙的基部较高'
      self.feather = '多为褐色、灰色、白色'
      self.rating = rating

    def info(self):
      print('编号{}\n'.format(self.rating))
      print('{}\n'.format(self.name))
      print('{}\n'.format(self.feature))
      print('{}\n'.format(self.feather))


for i in range(4):
    geese = input("the name of the bird:\n")
    geese = Geese(i)
    geese.info

运行只有输入嗷(求助大佬why没有进入Geese且输出.....)

FishC 发表于 2024-4-12 11:10:37

你的代码有一些小问题。首先,你需要调用`geese.info()`而不是只写`geese.info`。其次,在构造方法中对实例编号的类属性进行加1操作,你可以将类属性放在类定义的外部,并通过`Geese.rating += 1`来对其进行加1操作。最后,你可以在`for`循环的开头加上一个输入提示,让用户输入雁的名称。

修改后的代码如下:

class Geese:
    name = '大雁'
    feature = '体型大,喙的基部较高'
    feather = '多为褐色、灰色、白色'
    rating = 0

    def __init__(self, rating):
      Geese.rating += 1
      self.rating = rating

    def info(self):
      print('编号{}\n'.format(self.rating))
      print('{}\n'.format(Geese.name))
      print('{}\n'.format(Geese.feature))
      print('{}\n'.format(Geese.feather))


for i in range(4):
    geese_name = input("请输入雁的名称:")
    geese = Geese(i)
    geese.info()

希望这能解决你的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

纪叶 发表于 2024-4-12 11:13:25

FishC 发表于 2024-4-12 11:10
你的代码有一些小问题。首先,你需要调用`geese.info()`而不是只写`geese.info`。其次,在构造方法中对实例 ...

def __init__(self, rating) 是一个发挥什么作用的存在?

FishC 发表于 2024-4-12 11:13:39

纪叶 发表于 2024-04-12 11:13
def __init__(self, rating) 是一个发挥什么作用的存 ...

在Python中,`__init__()`是一个特殊的方法,它是在类实例化时自动调用的构造方法。它的作用是对新创建的对象进行初始化操作。

在上面的代码中,`__init__()`方法接受一个参数`rating`,该参数用于设置实例的编号。在方法体内,我们通过`self.rating = rating`将传入的参数赋值给实例的`rating`属性。

当我们创建一个雁类的实例时,比如`geese = Geese(0)`,实例化过程会自动调用`__init__()`方法,并将参数0传递给`rating`参数。这样就能够为每个实例设置不同的编号。

需要注意的是,`__init__()`方法是在对象实例化时自动调用的,而不需要我们手动调用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

纪叶 发表于 2024-4-12 11:18:46

FishC 发表于 2024-4-12 11:13
在Python中,`__init__()`是一个特殊的方法,它是在类实例化时自动调用的构造方法。它的作用是对新创建 ...

`__init__()`方法是在对象实例化时自动调用的,是不是在我geese = Geese(0)时,对象geese就自动调用了Geese内的__init__构造法?

FishC 发表于 2024-4-12 11:18:55

纪叶 发表于 2024-04-12 11:18
`__init__()`方法是在对象实例化时自动调用的,是不是 ...

是的,当你执行`geese = Geese(0)`时,`Geese`类会被实例化,并且自动调用`__init__()`方法来进行对象的初始化操作。传递的参数0会被传递给`rating`参数,在`__init__()`方法内部,它会将这个值赋给实例的`rating`属性。

所以,当你执行`geese = Geese(0)`后,对象 `geese` 就拥有了一个 `rating` 属性,并且值为0。这个过程完全是自动完成的,你无需手动调用 `__init__()` 方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

纪叶 发表于 2024-4-12 11:19:32

FishC 发表于 2024-4-12 11:10
你的代码有一些小问题。首先,你需要调用`geese.info()`而不是只写`geese.info`。其次,在构造方法中对实例 ...

将类属性放在类定义的外部,后续调用中能更改该类属性吗

FishC 发表于 2024-4-12 11:19:46

纪叶 发表于 2024-04-12 11:19
将类属性放在类定义的外部,后续调用中能更改该类属性 ...

如果将类属性放在类定义的外部,可以通过类名直接访问和修改该类属性。例如,我们将类属性`name`放在类定义的外部,然后在后续调用中进行修改:

class Geese:
    rating = 0

    def __init__(self, rating):
      Geese.rating += 1
      self.rating = rating

    def info(self):
      print('编号{}\n'.format(self.rating))
      print('{}\n'.format(Geese.name))


# 将name类属性放在类定义的外部
Geese.name = '大雁'

for i in range(4):
    geese_name = input("请输入雁的名称:")
    # 修改name类属性
    Geese.name = geese_name
    geese = Geese(i)
    geese.info()

这样,每次创建实例之前,都可以通过修改`Geese.name`来改变所有实例的类属性`name`的值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 定义类,在构造法中对类属性进行加一操作