2017-07-28 13 views
0

は、次のコードを見てください:このクラスをPythonで別のファイルに移動するにはどうすればよいですか?

class Main: 
    def __init__(self): 
     # list to keep track of instances of Sub() 
     self.sub_list = [] 
     # create instances of Sub()  
     self.a = Sub() 
     self.b = Sub() 
     # append instances to sub_list  
     self.sub_list.append(self.a) 
     self.sub_list.append(self.b) 


class Sub: 
    # function to remove the instance from sub_list 
    def remove_self(self): 
     x.sub_list.remove(self) 


x = Main() 

# remove instances of Sub() from sub_list 
x.a.remove_self() 
x.b.remove_self() 

私の目標は、それらが作成された別のクラス、のリストから自分自身を削除するメソッドを持つオブジェクトを持つことです。

上記のコードはこれに対応していますが、私はxを直接使用してメソッドを呼び出す必要があります。私は解決したい

主な問題は、しかし、私は私はもうsub_listにアクセスすることができないとして、別のファイルにクラスSubを移動する方法を見つけ出すことができないということです。

これを行うより良い方法はありますか?

サイドノート:私は、Mainが私のMainWindowであり、Subは、動的に作成され、閉じられるいくつかのUI要素を表しているPyQtのプロジェクトに取り組んでいます。可能であれば、これらの要素内にすべての機能を保持したいと思います。

答えて

1

理想的な解決策は、sub_listをまったく持たないことです。あなたの例では、それぞれSubのインスタンスが自分自身にフィールドを取得するので、不要です。

sub.py:あなたはそうのようにそれを行うことができます別のファイルにSubを移動したい場合には、言われて

あなた main.py
class Sub: 
    def __init__(self, parent): 
     self.parent = parent 

    def remove_self(self): 
     self.parent.sub_list.remove(self) 

そして:

from sub import Sub 
class Main: 
    def __init__(self): 
     self.sub_list = [] 
     self.a = Sub(self) 
     self.b = Sub(self) 
     self.sub_list.append(self.a) 
     self.sub_list.append(self.b) 

次に、あなたがすることができますdo:

x = Main() 
x.a.remove_self() 

または

x.sub_list[0].remove_self() 

または代わりに、これは私がお勧めのアプローチでは、remove_selfを取り除くとSubインスタンスを削除するの面倒をそのMainに新しい機能を追加します。

class Main: 
    def __init__(self): 
     self.sub_list = [] 
     self.a = Sub(self) 
     self.b = Sub(self) 
     self.sub_list.append(self.a) 
     self.sub_list.append(self.b) 

    def removeSub(self, index): 
     self.sub_list.pop(index) 

x = Main() 
x.removeSub(0) 
+0

感謝をあなたの答えのために!これが 'sub_list'なしで行えるのであれば、私はそうすることができます。私のプロジェクトでは、すべてのインスタンスを追跡し、後ですべてのインスタンスに対して 'submit'メソッドを呼び出す必要があります。これは、追跡するために何らかの種類のデータ構造なしで行うことができますか? – michaelh

+0

@michaelhあなたが現在持っているものは良いです。私の2つの提案された方法のいずれかがあなたのために働くはずです。それがあなたを助けたならば、答えが受け入れられたとマークしてください、そして運が良ければ。 – stybl

+0

私のコードであなたのソリューションを試したところ、完全に動作します。ありがとうございました! – michaelh

関連する問題