Python pickle 打印内存地址?

Python pickle prints memory address?

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

代码如下:

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

这与 pickle 无关;如果你只是直接创建一个 Person 并打印它,你会得到相同的结果。那是因为你还没有告诉 Python 它应该如何打印那种类型的对象,所以它使用默认值,即内存地址。

要解决此问题,请将 __str__ 方法添加到 class:

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

自定义 classes 的 默认 表示是打印他们的名字和他们的 id():

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

您可以给一个 class 一个 __repr__ method to change the default representation, or a __str__ method 来控制实例如何转换为字符串(例如通过 print 函数)。

请注意,当打印 list 或其他容器时,该列表的内容将通过表示形式显示(使用 repr(),而不是 str() ).

请注意,在您的代码中,您只会加载文件中的第一个人;您从不存储实例列表,而是在每次调用 addPerson().

将文件内容替换为新的 pickle pickle