22

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

2つの質問:

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

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

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()

また、あるクラスから別のクラスに「値」を渡すにはどうすればよいですか?

私の一般的なアプローチや構文が間違っているかどうか教えてください。

4

5 に答える 5

11

インスタンスまたはクラスのすべての属性にアクセスし、それを介し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)

aselfはキーワードではなく、 andのような単なるパラメータ名であることに注意してください。たとえば、Javaのバックグラウンドを持っている場合は、代わりbに使用したくなるかもしれません。この目的のためthisに使用する非常に強力な慣習があり、他のものを使用すると、多くの人(最終的には自分自身を含む)を非常に怒らせるでしょう!self

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

編集

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

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

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

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

于 2012-08-17T16:16:49.023 に答える
2

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

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)
于 2012-08-17T15:55:03.153 に答える
1

あなたは正しい方向に進んでいます、試してみてください:

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)
于 2012-08-17T15:55:38.863 に答える
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))

このプログラムが行うことMyClassは、クラスオブジェクトを含むクラスを作成することinstance_listです。 instance_listインスタンスのリストになります。classメソッドmake_instancesはまさにそれを行います。インスタンスを作成してデータを設定しますinstance_list。プログラムの最後に、an_instance「通常」インスタンスを作成する方法を作成します。an_instanceクラスのオブジェクトもそうですMyClass

これがお役に立てば幸いです

于 2017-08-19T06:25:08.497 に答える
0

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

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

そして、あなたが書かなければならないメソッドにアクセスするためにr1.foo() あなたはinitメソッドを作成した ので、あなたはあなたのコードでそうであるのself.foo()と同じであるfoo関数にアクセスしなければなりません。r1.foo()foo1.do_something()self.foo1.do_something()

于 2019-11-08T06:15:00.047 に答える