使用python将对象追加到列表中会抛出对象内存地址,而不是对象内部的数据

时间:2018-10-20 06:13:18

标签: python list object methods append

当我尝试添加在循环中创建的对象时,我得到了一个奇怪的输出

animals.txt

ralph, dog, 3
buster, cat, 8
sammy, bird, 5
mac, dog, 1
coco, cat, 6

pet.py

class Pet:
    # The __init__ method initializes the data attributes of the Profile class
    def __init__(self, name ='', animal_type = '', age = ''):
        self.__name = name
        self.__animal_type = animal_type
        self.age = 0

    def __str__(self):
        string = self.__name + ' ' + self.__animal_type + ' ' + str(self.age)
        return string

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_animal_type(self, breed):
        self.__animal_type = breed

    def get_animal_type(self):
        return self.__animal_type

    def set_age(self, old):
        self.age = old    

    def get_age(self):
        return self.age  

animals.py

import pet

myPet = pet.Pet()

animals = []

infile = open("animals.txt", "r")

lines = infile.readlines()

for line in lines:
    data = line.split(",")
    myPet.set_name(data[0])
    myPet.set_animal_type(data[1])
    myPet.set_age(data[2])
    # print (data[0], data[1], data[2])
    print(myPet)
    animals.append(myPet)    

print(animals)

infile.close()

当我使用 print(myPet)打印每次迭代创建的对象时,我得到了;

  

拉尔夫犬3

     

克星猫8

     

萨米鸟5

     

mac dog 1

     

可可猫6

然后我附加对象myPet,这是当我打印(动物)

时在列表中重复输出5次的结果
  

pet.Pet对象位于0x00000185DCAE1128

我不确定发生了什么 我尝试过

myPet.set_name(data[0])
animals.append(myPet.get_name)

myPet.set_name(data[0])
name = myPet.get_name
animals.append(name)

出现相同的错误

  

pet.Pet对象在0x000002C0F0BF6C88处的绑定方法Pet.get_name

2 个答案:

答案 0 :(得分:2)

更改代码,以便为每个Pet创建一个新的Pet实例,而不是更改现有Pet实例的值,这意味着您会将不同的pet值追加到列表中。

import pet

animals = []

infile = open("animals.txt", "r")

lines = infile.readlines()

for line in lines:
    data = line.split(",")
    myPet = pet.Pet()
    myPet.set_name(data[0])
    myPet.set_animal_type(data[1])
    myPet.set_age(data[2])
    # print (data[0], data[1], data[2])
    print(myPet)
    animals.append(myPet)    

print(animals)

infile.close()

答案 1 :(得分:2)

当您print的单个实例MyPet时,Python会调用MyPet的{​​{1}}方法来获取字符串表示形式。

打印对象列表时,Python将在列表的每个元素上显示调用repr的结果。默认情况下会产生

  

用尖括号括起来的字符串,其中包含对象类型的名称以及通常包括对象名称和地址的其他信息

您可以通过向__str__添加__repr__方法来覆盖此行为;此代码使MyPet__str__相同:

__repr__

按惯例,class MyPet: def __repr__(self): string = self.__name + ' ' + self.__animal_type + ' ' + str(self.age) return string __str__ == __repr__ 的输出为

  

一个字符串,当传递给eval()时将产生具有相同值的对象

您可以使用以下代码进行操作:

__repr__