我为电话和电子邮件地址编写了一个应用程序,但是当我想要打印数据时,我得到了内存地址而不是数据。
代码如下:
import pickle
class Person:
def __init__(self, name, lastName, phone, email):
self.name=name;
self.lastName=lastName;
self.phone=phone;
self.email=email;
class Adressar:
def __init__(self,):
print('telefonski imenik');
def interface(self):
print('Upišite broj od 1 do 4 za izbor funkcije');#write No from 1 to 4 for function selection
print('Upiši 1 za upis novog kontakta');#No 1 for adding new conntact
print('Upiši 2 za pretragu kontakta');#No 2 for contact search
print('Upiši 3 za brisanje kontakta');#No 3 for contact erasing
print('Upiši 4 za izlistavanje svih kontakata');#No 4 for giving list of all contacts
num=int(input('Upis odgovarajućeg broja... '));#input number
if num>4:
print('Greška! Upisi broj od 1 do 4!');#no is larger than 4
else:
return num;
def addPerson(self):
with open("adresar.pickle", 'wb') as fileIn:
name=input('Upiši ime: ');#write name
lastName=input('Upiši prezime: ');#write last name
phone=input('Upiši broj telefona: ');#write phone no
email=input('Upiši email: ');#write email
pickle.dump(Person(name, lastName, phone, email), fileIn);
start=Adressar();
num=start.interface();
storedList=[];
if num==1:
start.addPerson();
with open("adresar.pickle", 'rb') as f:
storedList=pickle.load(f);
print(storedList);
答案 0 :(得分:1)
这与泡菜无关;如果您只是直接创建了一个Person并打印出来,那么您将获得相同的结果。那是因为你没有告诉Python它应该如何打印那种类型的对象,所以它使用默认的内存地址。
要解决此问题,请在课程中添加__str__
方法:
class Person:
...
def __str__(self):
return 'This is {} and their email is {}'.format(self.name, self.email)
答案 1 :(得分:0)
自定义类的默认表示形式是打印其名称及其id()
:
>>> class Foo: pass
...
>>> Foo()
<__main__.Foo instance at 0x106aeab90>
您可以为类添加__repr__
method来更改默认表示,或者__str__
method来控制实例如何转换为字符串(例如通过print
函数)。
请注意,在打印列表或其他容器时,该列表的内容将以表示形式显示(使用repr()
,而不是str()
)。
请注意,在您的代码中,您只会加载文件中的第一个人;您永远不会存储实例列表,而是在每次调用pickle
时使用新的addPerson()
替换文件的内容。