2017-08-01 179 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)