web-dev-qa-db-ja.com

Python:クラスインスタンス間で変数を渡す、または呼び出し元を取得するにはどうすればよいですか?

class foo():
  def __init__(self)
    self.var1 = 1

class bar():
  def __init__(self):
    print "foo var1"

f = foo()
b = bar()

Fooで、「var1」を1に設定する何かをしています。barで、var1の内容にアクセスしたいと思います。

Barのインスタンスb内からfooのクラスインスタンスfのvar1にアクセスするにはどうすればよいですか?

基本的に、これらのクラスは異なるwxframeです。したがって、たとえば1つのウィンドウでユーザーが入力データを入力している場合、2番目のウィンドウではその入力データを使用して出力を生成します。 C++では、呼び出し元へのポインターがありますが、Pythonで呼び出し元にアクセスする方法がわかりません。

10
lme

WxPythonのさまざまなページが同じ情報にアクセスして編集する一般的な方法として、MainFrame(またはそれを呼び出したもの)クラスにinfoクラスのインスタンスを作成し、そのインスタンスを作成した他のページに渡すことを検討してください。例えば:

class info():
    def __init__(self):
        self.info1 = 1
        self.info2 = 'time'
        print 'initialised'

class MainFrame():
    def __init__(self):
        a=info()
        print a.info1
        b=page1(a)
        c=page2(a)
        print a.info1

class page1():
    def __init__(self, information):
        self.info=information
        self.info.info1=3

class page2():
    def __init__(self, information):
        self.info=information
        print self.info.info1

t=MainFrame()

出力は次のとおりです。

initialised
1
3
3

infoは、インスタンスが1つしかないことを証明した後でのみ初期化されますが、page1はinfo1変数を3に変更し、page2はその変更を登録しました。

16
Rowan

Init引数を変更せずにこれを行う方法を示すコード例を提供した人は誰もいません。 2つのクラスを定義する外部スコープの変数を使用するだけで済みます。ただし、一方のクラスがもう一方のクラスとは別のソースファイルで定義されている場合、これは機能しません。

var1 = None
class foo():
  def __init__(self)
    self.var1 = var1 = 1

class bar():
  def __init__(self):
    print var1

f = foo()
b = bar()
7
AcidTonic

他の言語と同じです。

class Foo(object):
    def __init__(self):
        self.x = 42

class Bar(object):
    def __init__(self, foo):
        print foo.x

a = Foo()
b = Bar(a)
5
Cat Plus Plus

あるいは、両方の派生クラスがクラス変数var1を継承する共通の基本クラスを持つこともできます。このようにして、派生クラスのすべてのインスタンスが変数にアクセスできます。

1
user943354

何かのようなもの:

class foo():
  def __init__(self)
    self.var1 = 1

class bar():
  def __init__(self, foo):
    print foo.var1

f = foo()
b = bar(foo)

C++でポインタを渡すのと同じように、Pythonでオブジェクトを渡すことができるはずです。

0
Winston Ewert

おそらく、この質問がされたので、これは言語に追加されました...

Globalキーワードが役立ちます。

x = 5

class Foo():
    def foo_func(self):
        global x    # try commenting this out.  that would mean foo_func()
                    # is creating its own x variable and assigning it a
                    # value of 3 instead of changing the value of global x
        x = 3

class Bar():
    def bar_func(self):
        print(x)

def run():
    bar = Bar()     # create instance of Bar and call its
    bar.bar_func()  # function that will print the current value of x

    foo = Foo()     # init Foo class and call its function
    foo.foo_func()  # which will add 3 to the global x variable

    bar.bar_func()  # call Bar's function again confirming the global
                    # x variable was changed 


if __name__ == '__main__':
    run()
0
Scotty Stephens