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

私が試みたのは、単純なクラスを作成して追加機能を作成することでした。 私のクラスのすべてのオブジェクトを印刷するためのコードもあります。そのコードは2回実行されます。追加関数内の最後とコード全体の1回です。私はそれらを区別するために2つの線を印刷しました。

コードを実行し、追加機能を使用してAlex Alberts、Brian Borne、Casey Connor、Donna Dawson、Emma Edwardsの5つの名前を追加しました。結果は次のようになります。

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

あなたの 'adding()'関数には再帰があります。これは予想外のパターンを説明します。だから、あなたが '' Alex Alberts ''を追加すると、 '' Brian Borne ''というように追加します。すべての入力が完了すると、最後の 'adding()'コールに属するスタックされた 'get_objects()'ループはすべて、最初の 'adding()'コールから順番に実行されます。この積み重ねがそのパターンを引き起こしています。したがって、この場合、再帰を避ける必要があります。 – nikpod

+0

上記のコメントは正しいです。疑わしい再帰的ループによって引き起こされる問題に加えて、このように 'gc'を使用することは、非常に良いアイデアではありません。 –

答えて

0

gcモジュールを使用する代わりに、このような処理を行うことを検討してください。グローバル名前空間を使用してオブジェクトを保持することは効果的ではなく、後でコードから離れるときには読みにくく、非常に信頼性がありません。

オブジェクトをlistのように、ビルトインのPythonデータ構造の内部に置きます。この方法では、あなたは彼らがすべてであることを正確に知っていて、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) 
関連する問題