如何将多个对象属性存储到单个字典键?

时间:2015-11-30 17:30:26

标签: python arrays oop python-3.x dictionary

我对蟒蛇和编程的世界都很陌生,而且很难让我鼓起勇气提出问题,但是我踩到了,所以我认为id吸了它并要求帮助

我正在制作地址簿。

class Person():

    def __init__(self,name,number,email):
        self.name = name
        self.number = number
        self.email = email
contact = Person('Mike','1-800-foo-spam','email@email.com')

我的问题是如何将所有这些属性存储在字典中,其中contact.name作为键,contact.number和contact.email作为值。

奖金问题。 字典应该在课外,也许在主要功能中? 要么 它是否需要是一个类变量(不完全确定它们是如何工作的) 或对象变量

类似

self.storage = {}

非常感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:0)

你可以很容易地得到一个带有元组的字典作为值。

a = {}
a["bob"] = ("1-800-whatever","bob@gmail.com")

答案 1 :(得分:0)

如果你想把它变成一个类变量,你只需要在Person类中创建一个空字典:

class Person():

    storage = {}

然后在__init__中,您可以将新人的信息存储在该词典中:

def __init__(self,name,number,email):
    self.name = name
    self.number = number
    self.email = email
    Person.storage[name] = (number, email)

正如您所看到的,使用类名访问类属性,但与其他任何属性一样。如果需要更新它们,可以将它们存储为元组或列表。但是,如果您打算进行更改,最好存储实际的Person对象,以节省必须同时更新Person.storage和实际人员。这更容易做到:

def __init__(self,name,number,email):
    self.name = name
    self.number = number
    self.email = email
    Person.storage[name] = self

self指的是使用Person创建的__init__实例。那是迈克在你的例子中。然后,您可以按属性访问其值:

Person.storage["Mike"].number

同样正如凯文在评论中指出的那样,您可能想要检测密钥是否已经存在以避免覆盖旧条目(例如,如果字典中已有迈克):

    self.email = email
    if name in Person.storage:
        # Make unique name
    Person.storage[name] = (number, email)

答案 2 :(得分:0)

如果我把这些信息放在字典中,我会这样做:

class Person():

    def __init__(self,name,number,email):
        self.name = name
        self.number = number
        self.email = email
        self.storage = {self.name: [self.number, self.email]}

    def getStorage(self):
        return self.storage

contact = Person('Mike','1-800-foo-spam','email@email.com')

print contact.storage
# or
print contact.getStorage()

但是字典的整个想法是拥有许多键和相应的值。在这个例子中,它总是只有一个。所以,我想到了另一种模式:

class Person():

    def __init__(self,name,number,email):
        self.name = name
        self.number = number
        self.email = email

# creating some example contacts        
c1 = Person('Mike','1-800-foo-spam','email@email.com')
c2 = Person('Jim','1-700-foo-spam','e111mail@email.com')
c3 = Person('Kim','1-600-foo-spam','e222mail@email.com')

# creating a dictionary to fill it with c1..cn contacts
contacts = {}

# helper function to automate dictionary filling
def contactToDict(list_of_contacts):
    for item in list_of_contacts:
        contacts[item.name] = (item.number, item.email)

contactToDict([c1, c2, c3])

"""
expected output:
Mike: ('1-800-foo-spam', 'email@email.com')
Jim: ('1-700-foo-spam', 'e111mail@email.com')
Kim: ('1-600-foo-spam', 'e222mail@email.com')
"""
for key, val in contacts.items():
    print str(key) + ": " + str(val)

问题标题的答案:值应该是一种对象类型,允许在其中包含“列表”(即列表,元组,另一个字典或具有许多属性的自定义类型对象。)