2012-08-17 5 views
9

私は本とインターネットを介してPythonを学習していますが、クラスの問題に固執しています。python:別のクラスのクラスのインスタンスを作成する(一般的な例を含む)

2質問:

  1. どのように私は別の(別の)クラスの1クラスのインスタンスを作成するのですか?
  2. クラスとネスト(?)クラスの間で変数を渡すにはどうすればよいですか?

クラスのインスタンスを別の(別の)クラス内に作成しようとすると、メソッド内でそのインスタンスを作成できます。コード:

私はFOOクラスにアクセスすることができますが、これは他のBARメソッドの情報ですか?もしそうなら、どうですか?

私は、次を試してみましたが、エラーを得た:ここ

import os 

class FOO(): 
def __init__(self): 
    self.values = [2, 4, 6, 8] 

def do_something(self, x, y): 
    os.system("clear") 
    z = self.values[x] * self.values[y] 
    print "%r * %r = %r" % (self.values[x], self.values[y], z) 


class BAR(): 
def __init__(self): 
    foo1 = FOO() 

def something_else(self, a, b): 
    foo1.do_something(a, b) 

bar = BAR() 
bar.something_else(1, 2) 

は誤りです:

Traceback (most recent call last): 
File "cwic.py", line 22, in <module> 
bar.something_else(1, 2) 
File "cwic.py", line 19, in something_else 
foo1.do_something(a, b) 
NameError: global name 'foo1' is not defined 

私は私が使用したのと同じエラーを取得:

def __init__(self): 
    self.foo1 = FOO() 

また、あるクラスから別のクラスに '値'をどのように渡すべきですか?

一般的なアプローチや構文が間違っている場合は教えてください。私がちょうど学んでいるように、あらゆる、そしてすべての提案(朗読を含む)を歓迎します。ありがとう。

答えて

4

をインスタンスまたはクラスのすべての属性は、すべてのメソッドの最初の引数として渡されselfを介してアクセスされています。そのため、他の言語の場合と同じように、メソッドの署名something_else(self, a, b)を正確にはsomething_else(a, b)としています。だから、あなたが探している:自己がキーワードではないことを

class BAR(): 
     def __init__(self): 
      self.foo1 = FOO() 

    def something_else(self, a, b): 
     self.foo1.do_something(a, b) 

注意、それはabのようなだけのparamater名ですので、あなたは、たとえば、あなたがからなら代わりにthisを使用するように誘惑されるかもしれませんJavaの背景...しないでください!この目的のためにselfを使用するという非常に強力な条約があります。他のものを使用すると、多くの人々(最終的にあなた自身を含む)を非常に怒らせるでしょう!

値の受け渡しに関しては、foo1.an_attributeなどのインスタンスを使用してアクセスするか、function(arg)のように関数の引数として渡すことができますが、両方の手法を使用しているようです他に何があったのかわからない...

編集

@のdwsteinさんのコメントを受けて、私はそれはVBで行うのかどうかはわかりませんが、ここでクラスのインスタンスを作成するときに引数を渡す方法です。

私たちはあなたのクラスを見れば:

class BAR(): 
    def __init__(self): 
     self.foo1 = FOO() 

私たちは、私たちが望むならば、我々はBARの私たちの新しいインスタンスのbaz属性を作ることができ、その後def __init__(self, baz):第2ラインを変更することにより、引数のバズを受け入れるようにそれを変更することができself.baz = bazを設定します。希望が役立ちます。

+0

あなたの完全な答えをありがとう!非常に役立ちます。あるクラスから別のクラスにどのように情報を伝えるのかを理解しようとしています。私はクラス定義の一部として引数を見てきたと思うし、それが正しい方法かどうか疑問です。しかし、私はその機能の使い方を知らない。ちなみに、私はVBAの背景を持っています。 – dwstein

2

あなたのクラスインスタンスのメンバーにアクセスするには、常に "self"プレフィックスを使用する必要があります。あなたは正しい軌道に乗っている

class BAR(): 
    def __init__(self): 
     self.foo1 = FOO() 

    def something_else(self, a, b): 
     self.foo1.do_something(a, b) 
1

を試してみて、試してみてください。

class BAR(): 
    def __init__(self): 
     self.foo1 = FOO() 

    def something_else(self, a, b): 
     self.foo1.do_something(a, b) 
0

私はあなたの質問を理解しているか分かりませんが、これはあなたよりも私のことを反映しています。あなたが探しているものを理解していれば、クラスメソッド内でクラスのインスタンスを作成したいと思っています。さて、私はここから離れているかもしれないので、これが混乱しているなら、あなたの質問とは別の質問に答えているかもしれません。このプログラムは何

#! /usr/bin/env python3 

class MyClass (object): 

    instance_list = [] 

    def __init__ (self, arg1, arg2): 
    self.arg1 = arg1 
    self.arg2 = arg2 

    @classmethod 
    def make_instances(cls): 
    for a1 in range(1,4): 
     for a2 in range(1,3): 
     cls.instance_list.append(MyClass(a1, a2)) 

    @classmethod 
    def dump_instance_list (cls): 
    for instance in cls.instance_list: 
     print("arg1= %d\targ2= %d" % (instance.arg1, instance.arg2)) 

if __name__ == "__main__" : 
    MyClass.make_instances() 
    MyClass.dump_instance_list() 
    an_instance = MyClass(14, 22) 
    print("An instance: %d, %d" % (an_instance.arg1, an_instance.arg2)) 

は、クラスオブジェクト、instance_listを持つクラス、MyClassを作成することです。 instance_listはインスタンスのリストになります。クラスメソッドmake_instancesは、インスタンスを作成してinstance_listを生成します。プログラムの終わりに、私はan_instanceを作成し、通常はインスタンスを作成します。したがってan_instanceはクラスMyClassのオブジェクトです。

私はこれが役に立ちそうです

関連する問題