私はpython本とインターネットを介して学習しています。私はクラスの問題で立ち往生しています。
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つのクラスから別のクラスに「値」をどのように渡す必要がありますか?
私の一般的なアプローチや構文が間違っている場合はお知らせください。私はただ学んでいるだけなので、あらゆる提案を歓迎します(良い読書を含む)。ありがとう。
インスタンスまたはクラスのすべての属性は、すべてのメソッドの最初の引数として渡される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はキーワードではなく、a
やb
のような単なるパラメータ名であるため、たとえば、次のような場合は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を受け入れるように変更できます。必要に応じて、baz
をBAR
の新しいインスタンスの属性に設定できます。 _self.baz = baz
_。お役に立てば幸いです。
pythonでは、クラスインスタンスのメンバーにアクセスするときに、常に「self」プレフィックスを使用する必要があります。
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
あなたは正しい軌道に乗っています、試してみてください:
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
クラスの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()
にする必要があります
私はあなたの質問を理解しているかどうかわかりません。これはあなたよりも私を反映したものです。探しているものがわかったら、クラスメソッド内にクラスのインスタンスを作成します。さて、私は「ここから外れている可能性があります。そのため、これが混乱している場合は、あなたの質問とは異なる質問に答えている可能性があります。
#! /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
クラスのオブジェクトです。
これが役に立てば幸い