当我尝试添加在循环中创建的对象时,我得到了一个奇怪的输出
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
答案 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__