Python pickle打印内存地址?

时间:2015-02-24 12:29:58

标签: 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);

2 个答案:

答案 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() 替换文件的内容。