2015-02-24 53 views
0

我写了一个电话和电子邮件地址的应用程序,但是当我想打印数据时,我得到了内存地址而不是数据。Python pickle打印内存地址?

的代码如下:

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); 
+1

您需要覆盖'__str__'和'__repr__'以特定于您的课程。阅读此:http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – 2015-02-24 12:32:27

回答

0

默认自定义类的代表是打印他们的名字和他们的id()

>>> class Foo: pass 
... 
>>> Foo() 
<__main__.Foo instance at 0x106aeab90> 

你可以给类别__repr__ method更改默认表示,或__str__ method来控制实例如何转换为字符串(例如通过print函数离子)。

注意,打印列表或其他容器时,该列表中的内容将被显示的表示(repr()被使用,不str())。

请注意,在您的代码中,您只会加载文件中的第一个人;你永远不会存储一个实例列表,而是你每次拨打addPerson()时用替换的文件内容,并用新的pickle

+0

谢谢。我做到了。现在我也可以添加新的数据。 – sziza 2015-02-25 13:18:18

1

这不是什么做泡菜;如果您只是直接创建了一个人并将其打印出来,您会得到相同的结果。那是因为你没有告诉Python它应该如何打印该类型的对象,所以它使用默认的内存地址。

为了解决这个问题,添加一个__str__方法的类:

class Person: 
    ... 
    def __str__(self): 
     return 'This is {} and their email is {}'.format(self.name, self.email) 
+0

正确答案+1。或者使用'_unicode__' – 2015-02-24 12:33:32

+0

'__unicode__'仅适用于Python 2;我认为OP是使用Python 3. – 2015-02-24 12:34:00

+0

不够公平:) – 2015-02-24 12:34:15