【问题标题】:Creating a list using private variables in a class使用类中的私有变量创建列表
【发布时间】:2025-12-29 00:10:16
【问题描述】:

我正在创建一个名为Pet 的类。我将我的变量设为私有,因此没有人可以修改它们(确保封装)。我想使用私有变量创建一个列表。 然后我希望能够将我的pet_list list outside 称为我将在以后使用它的类(我是否需要在Pet 类中为我的列表创建一个getter这样做?)。

我是 python 新手,但我正在尝试使用面向对象的原则进行编码。

到目前为止,这是我的代码。 我在想,因为我的pet 变量是私有的,我需要使用setter 来设置列表中的Pets?但是当我想打印 set_pet() missing 1 required positional argument: 'pet' 时出现此错误。

class Pet:
      def __init__(self, pet ):
          self.pet = pet

      def set_pet(self, pet):
         self.__pet = pet

      def get_pet(self):
         return self.__pet


#creating list

pet_list = []

p = Pet

pet_list.append(p.set_pet("cat"))
pet_list.append( Pet("dogs"))
pet_list.append( Pet("fish"))
pet_list.append( Pet("horses"))
pet_list.append( Pet("birds"))

for obj in pet_list:
    print(obj.pet)

【问题讨论】:

  • p = Pet("cat")? p = Pet 只是给你一个类的别名。目前尚不清楚为什么您创建的那个与您放入列表中的其他人不同。最后你还需要get_pet(或阅读@property)。
  • 不,它不是创建一个实例——你需要括号来调用类来获取一个实例。

标签: python list class oop getter-setter


【解决方案1】:

问题出在p = Pet。在这里,您没有初始化 class Pet 的实例,而是将 p 设置为等于该类。而是使用

p = Pet("The pet you want")

您收到错误set_pet() missing 1 required positional argument: 'pet' 的原因是因为"cat" 被作为位置参数传递,而不是self,因此就好像您只传递了一个参数。

此外,pet_list.append(p.set_pet("cat")) 会将None 附加到列表中,因为您只是设置属性而不返回任何内容,所有其他属性都应按预期正常工作。

【讨论】:

  • 是的,我现在明白了!我将代码更改为您所说的,现在可以使用了,谢谢:)