繁体   English   中英

Python pickle打印内存地址?

[英]Python pickle prints memory address?

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

代码如下:

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

这和泡菜无关。 如果您只是直接创建一个人并打印出来,您将得到相同的结果。 那是因为您没有告诉Python如何打印该类型的对象,因此它使用默认值即内存地址。

要解决此问题,请在类中添加__str__方法:

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

自定义类的默认表示是打印其名称和id()

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

您可以为类提供__repr__方法来更改默认表示形式,或者为__str__方法提供控制实例如何转换为字符串的方式(例如通过print函数)。

请注意,在打印列表或其他容器时,该列表的内容将由表示形式显示(使用repr() ,而不是str() )。

请注意,在您的代码中,您只能加载文件中的第一个人。 您从不存储实例列表,而是在每次调用addPerson()时用新的pickle 替换文件的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM