web-dev-qa-db-ja.com

python:別のクラスにクラスのインスタンスを作成(一般的な例を使用)

私はpython本とインターネットを介して学習しています。私はクラスの問題で立ち往生しています。

2つの質問:

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

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

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):
        pass

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

bar = BAR()
bar.something_else(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()

また、1つのクラスから別のクラスに「値」をどのように渡す必要がありますか?

私の一般的なアプローチや構文が間違っている場合はお知らせください。私はただ学んでいるだけなので、あらゆる提案を歓迎します(良い読書を含む)。ありがとう。

13
dwstein

インスタンスまたはクラスのすべての属性は、すべてのメソッドの最初の引数として渡される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)
_

Selfはキーワードではなく、abのような単なるパラメータ名であるため、たとえば、次のような場合はthisを使用したくなるかもしれません。 a Java背景...しないでください!この目的のためにselfを使用する非常に強力な規則があり、多くの人(最終的には自分を含む)を作ることになります何か他のものを使うととても怒ります!

値の受け渡しに関しては、どういう意味かわかりませんが、_foo1.an_attribute_などのインスタンスを介してアクセスするか、function(arg)のように関数の引数として渡すことができますが、両方を使用したようですあなたの例のテクニックなので、あなたが他に何をしているのかわかりません...

編集

@dwsteinのコメントに応じて、VBでどのように行われるかはわかりませんが、クラスのインスタンスを作成するときに引数を渡す方法を次に示します。

あなたのクラスを見ると:

_class BAR():
    def __init__(self):
        self.foo1 = FOO()
_

2行目をdef __init__(self, baz):に変更することで、引数bazを受け入れるように変更できます。必要に応じて、bazBARの新しいインスタンスの属性に設定できます。 _self.baz = baz_。お役に立てば幸いです。

6
redrah

pythonでは、クラスインスタンスのメンバーにアクセスするときに、常に「self」プレフィックスを使用する必要があります。

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

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

あなたは正しい軌道に乗っています、試してみてください:

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

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

クラスのdef __init__(self):メソッドを作成しない場合は、クラスを次のように初期化する必要があります。例:

class XYZ:
    def foo(self):
        ....
        ....
r1 = XYZ()

メソッドにアクセスするには、r1.foo()と記述する必要がありますが、initメソッドを作成したので、self.foo()と等しいr1.foo()としてfoo関数にアクセスする必要があります。コード、foo1.do_something()ではなく、self.foo1.do_something()にする必要があります

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_instanceMyClassクラスのオブジェクトです。

これが役に立てば幸い

0
user1928764