【问题标题】:Python list in a function in a class类中函数中的 Python 列表
【发布时间】:2023-03-10 00:25:02
【问题描述】:

我正在尝试打印由此类中的函数创建的列表 - 我需要修复什么?我正在按照[<__main__.Person instance at 0x1004a0320>, 的行从终端获取输出。

class Person:
    def __init__(self,first,last,id,email):
        self.firstName=first
        self.lastName=last
        self.id=id
        self.email=email
        self.friends=[]
    def add_friend(self,friend):
        if len(self.friends)<5:
            self.friends.append(friend)
        if len(friend.friends)<5:
            friend.friends.append(self)

p1=Person("David","Waver","922-43-9873","dwaver@wsu.edu")
p2=Person("Bob","Jones","902-38-9973","bjones@odu.edu")
p3=Person("James","Smith","302-38-9103","jonsdfes@ou.edu")
p4=Person("Tim","Jack","902-38-0918","remmy@usc.edu")
p5=Person("Jim","Johnston","314-78-2343","jjohnston@fsu.edu")
p6=Person("Gina","Relent","102-38-1064","ginar@wvu.edu")
p7=Person("Greg","Morris","932-38-4473","jones@ttu.edu")

p1.add_friend(p2)
p1.add_friend(p3)
p1.add_friend(p4)
p1.add_friend(p5)
p1.add_friend(p6)
p1.add_friend(p7)

print p1.friends

【问题讨论】:

  • 您是否要打印人员对象或其姓名(或其他详细信息)?
  • 我刚刚开始学习课程;将各种person 实例的属性添加到friends 列表中是这里的目标,具体如何完成并不是我真正担心的,因为它似乎很容易改变。
  • 您实际上是在将人员对象添加到好友列表中。因此,当您尝试打印列表时,您会看到 shell 显示&lt;main.Person instance at 0x1004a0320&gt; 的列表。要打印人员对象的属性,您必须在您的人员类中定义__repr____str__。有关更多信息,请参阅 senderle 的答案。
  • 所以我试图将整个对象添加到列表中而不是属性中? __repr__ 允许我将这些人的实例的属性放入列表中,而在此之前我基本上是把整个对象都放在里面?
  • 是的,您正在将 Person 对象添加到列表中。 __repr__ 不会打印&lt;main.Person instance at 0x1004a0320&gt;,而是告诉解释器在您尝试打印对象时打印您指定的任何内容。您可以查看python repr docs 了解更多信息。

标签: python list class function


【解决方案1】:

您需要在Person 类中定义__repr____str__

>>> class Person:
...     def __init__(self,first,last,id,email):
...         self.firstName=first
...         self.lastName=last
...         self.id=id
...         self.email=email
...         self.friends=[]
...     def add_friend(self,friend):
...         if len(self.friends)<5:
...             self.friends.append(friend)
...         if len(friend.friends)<5:
...             friend.friends.append(self)
...     def __repr__(self):
...         return self.firstName + ' ' + self.lastName

然后如上初始化列表...

>>> print p1.friends
[Bob Jones, James Smith, Tim Jack, Jim Johnston, Gina Relent]

answer 很好地解释了这些功能。

鉴于上述帖子中关于__repr____str__ 的功能的观点,__repr__ 应该看起来更像这样:

def __repr__(self):
    template = "Person('{0}', '{1}', '{2}', '{3}')"
    return template.format(self.firstName, self.lastName, self.id, self.email)

上面的好处是它会生成一个字符串,当评估时,它会创建一个与原始对象具有相同属性(friends 除外)的对象。例如:

>>> print p1
Person('David', 'Waver', '922-43-9873', 'dwaver@wsu.edu')
>>> Person('David', 'Waver', '922-43-9873', 'dwaver@wsu.edu')
Person('David', 'Waver', '922-43-9873', 'dwaver@wsu.edu')

【讨论】:

  • @ZCJ,不完全是。它们正在您提供的代码中“打印”。当你print一个对象时,它的__repr__方法被调用,返回的字符串作为对象的表示。 &lt;main.Person instance at 0x1004a0320&gt; 是默认的 __repr__ 函数返回的内容。最后的那个十六进制 id 是对象的内存地址。 (这与hex(id(p1)) 返回的内容相同)。对于自定义类,如果您希望它看起来正确,Python 希望您提供自己的__repr__;如果你不这样做,它只是使用默认值。
  • @ZCJ,我不确定您所说的“通过类的对象”和“通过函数的对象”是什么意思。函数返回的对象和类返回的对象没有区别。字符串和内置类型(如列表和字典)具有预定义的 __repr__ 函数,这些函数比默认函数做得更多。 p1.firstname 是一个字符串,所以它像字符串一样打印出来。
  • @ZCJ,仍然不太清楚您所说的“通过字符串”是什么意思。打印列表时,列表的__repr__ 函数调用其中对象的__repr__ 函数。因此列表中的字符串按预期打印。但是,如果您将字符串存储为对象的一部分而没有自定义 __repr__ 函数,Python 不知道这样做。
  • 你似乎非常非常困惑。 Python 中的一切都是对象。字符串是对象。类的实例是对象。类本身就是对象。函数是对象。所以我们从那里开始。一切,作为一个对象,都可以打印出来。打印某些内容需要通过__str____repr__ 方法(视情况而定)将其转换为字符串。 (是的,每个字符串都有一个 __str__ 方法 - 返回自身 - 和一个 __repr__ 方法。)当你没有为你的类定义这些方法时,它们会得到默认行为,所以 something 出现。
  • (con't) “遍历”一个函数或一个类是一个没有任何意义的短语。类是对象的蓝图;您实例化该类以获取一个对象。函数返回对象。无论哪种方式,对象都是对象。
【解决方案2】:

对象的表示由其__repr__() 方法返回的字符串给出。打印对象本身时显示的字符串是从其__str__() 方法返回的字符串。框架可以使用__unicode__() 方法返回的字符串来显示对象。

class Person:
   ...
  def __repr__(self):
    return 'Person: %s, %s' % (self.lastName, self.firstName)

【讨论】:

    【解决方案3】:

    你需要为你的类定义一个__repr__ 方法。比如像这样

    class Person:
        def __repr__(self):
            return '%s, %s, %s, %s' %(self.firstName, self.lastName, self.id, 
                                      self.email)
    

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2019-03-26
      • 2022-11-24
      • 1970-01-01
      • 2022-11-14
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多