2017-08-01 28 views
1

我想添加一个对象到一个具有函数的类。 这是我试过的,但输出结果并不是我所期望的。如何编写将对象添加到类的函数?

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名:亚历艾伯茨,布莱恩承担,卡西康纳,唐娜Dawson和埃玛爱德华兹。这是结果:

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 

我不知道为何物似乎消失,为什么添加打印功能与该模式的名称。我期望的,我希望代码打印示例对象和我只输入一次的所有名称。我想在最后添加功能和代码来打印相同的对象名称。

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

+0

你的'adds()'函数有一个递归。这解释了意想不到的模式。所以,当你执行'添加'('Alex Alberts')'时,你可以调用'添加'('Brian Borne')'等等。一旦所有输入完成,所有叠加起来的'get_objects()'循环属于最后一个'adds()'调用,通过第一个'adding()'调用一个接一个执行。该堆叠正在导致该模式。所以,在这种情况下,你必须避免递归。 – nikpod

+0

以上评论是正确的。除了由可疑递归循环引起的问题之外,以这种方式使用'gc'并不是一个好主意 - 有更好更脆弱的方法。 –

回答

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)