如何编写将对象添加到类的函数?

时间:2017-08-01 02:56:30

标签: python class oop object garbage-collection

我想用一个函数向一个类添加一个对象。 这是我尝试过的,但输出并不是我所期望的。

import gc

class People:
    def __init__(self, name):
        self.name = name

example = People('example')

def adding():
    firstName = input('First name:')
    lastName = input('LastName:')
    fullName = firstName + " " + lastName
    fullName = People(fullName)
    addMore = input('Add another one?')
    if addMore != 'no':
        adding()

    for obj in gc.get_objects():
        if isinstance(obj, People):
            print(obj.name)

adding()

print(10*'=')

for obj in gc.get_objects():
    if isinstance(obj, People):
        print(obj.name)

所以我尝试的是创建一个简单的类并创建一个添加函数。 我还有一些代码用于打印我班级中的所有对象。该代码执行两次:一次在添加函数的末尾,一次在所有代码的末尾。我在两者之间印了一条线来区分它们。

我执行了代码并使用添加功能添加了5个名字:Alex Alberts,Brian Borne,Casey Connor,Donna Dawson和Emma Edwards。这是结果:

example
Alex Alberts
Brian Borne
Casey Connor
Donna Dawson
Emma Edwards
example
Alex Alberts
Brian Borne
Casey Connor
Donna Dawson
example
Alex Alberts
Brian Borne
Casey Connor
example
Alex Alberts
Brian Borne
example
Alex Alberts
==========
example

我不确定为什么对象似乎正在消失,以及为什么添加功能会打印带有该模式的名称。我希望并且我希望代码能够打印示例对象以及我只输入一次的所有名称。我想要添加函数和最后的代码来打印相同的对象名称。

如果我没有清楚地解释所有这一切,我很抱歉。

1 个答案:

答案 0 :(得分:0)

考虑做更像这样的事情,而不是使用gc模块。使用全局命名空间来保存对象是无效的,以后当你离开代码一段时间后很难阅读,并且非常不可靠。

将对象放在内置python数据结构中,就像list一样。通过这种方式,您确切地知道他们都是,并且不必在gc.get_objects()locals()globals()中“查找”它们。

class People:
    def __init__(self, name):
        self.name = name

example = People('example')

def make_person():
    '''A person factory.'''
    firstName = input('First name:')
    lastName = input('LastName:')
    fullName = firstName + " " + lastName
    person = People(fullName)
    return person

def add_people(p_list, addMore='yes'):
    '''Adds people to a list.
    addMore is given the value of 'yes' by default
    in order to get the loop started. 
    '''
    while addMore == 'yes':
        p = make_person()
        p_list.append(p)
        addMore = input('Add another one?')

person_list = list() #  an empty list to hold all the people

add_people(person_list)

print(10*'=')

for obj in person_list:
    print(obj.name)