web-dev-qa-db-ja.com

変数の受け渡し、インスタンスの作成、自己、クラスの仕組みと使用法:説明が必要

私は一日中この席に座っていましたが、もう少し疲れていました。

Pythonが初めてです。

作業中のプログラムをクラスの関数の束に書き直しただけで、すべてが台無しになりました。私かどうかはわかりませんが、Webでクラスを処理する方法に関する初心者向けのチュートリアルが見つからなかったので、いくつか質問があります。

最初クラスの__init__セクションで、self.variable=somethingで変数の束を宣言しました。

その関数でself.variableを使用することにより、クラスのすべての関数でこれらの変数にアクセス/変更できることは正しいですか?言い換えれば、self.variableを宣言することで、これらの変数を作成しました。クラスのスコープ内のグローバル変数ですよね?

そうでない場合、どのように自己を処理しますか?

第二に、クラスに引数を正しく渡すにはどうすればよいですか?いくつかのサンプルコードはクールです。

番目、クラススコープ外のクラスの関数を呼び出すにはどうすればよいですか?いくつかのサンプルコードはクールです。

Fouthly、別のclass INITIALCLASSclass OTHERCLASSのインスタンスを作成し、OTHERCLASSからINITIALCLASSに変数を渡す方法いくつかのサンプルコードはクールです。

OTHERCLASSからの引数でINITIALCLASSから関数を呼び出したいです。これまでにやったことは。

class OTHERCLASS():
    def __init__(self,variable1,variable2,variable3):
        self.variable1=variable1
        self.variable2=variable2
        self.variable3=variable3
    def someotherfunction(self):
        something=somecode(using self.variable3)
        self.variable2.append(something)
        print self.variable2
    def somemorefunctions(self):
        self.variable2.append(variable1)

class INITIALCLASS():
    def __init__(self):
        self.variable1=value1
        self.variable2=[]
        self.variable3=''
        self.DoIt=OTHERCLASS(variable1,variable2,variable3)

    def somefunction(self):
        variable3=Somecode
        #tried this
        self.DoIt.someotherfunctions()
        #and this
        DoIt.someotherfunctions()

変数をクラスに渡す方法や、selfを処理する方法、使用する場合と使用しない場合を明確に理解していませんでした。クラスのインスタンスを適切に作成する方法も理解できなかったでしょう。一般的に私はクラスの仕組みを理解していませんでしたので、私がわからないように私を助けて説明してください(私は理解していないようです)。または、詳細なビデオまたは読みやすいチュートリアルを参照してください。

ウェブで見つけたものはすべて非常に単純な例であり、それはあまり役に立ちませんでした。または、クラスやクラスメソッドインスタンスなどの非常に短い定義だけです。

必要に応じて元のコードを送信できますが、かなり長いです。

39
Baf
class Foo          (object):
    # ^class name  #^ inherits from object

    bar = "Bar" #Class attribute.

    def __init__(self):
        #        #^ The first variable is the class instance in methods.  
        #        #  This is called "self" by convention, but could be any name you want.
        #^ double underscore (dunder) methods are usually special.  This one 
        #  gets called immediately after a new instance is created.

        self.variable = "Foo" #instance attribute.
        print self.variable, self.bar  #<---self.bar references class attribute
        self.bar = " Bar is now Baz"   #<---self.bar is now an instance attribute
        print self.variable, self.bar  

    def method(self, arg1, arg2):
        #This method has arguments.  You would call it like this:  instance.method(1, 2)
        print "in method (args):", arg1, arg2
        print "in method (attributes):", self.variable, self.bar


a = Foo() # this calls __init__ (indirectly), output:
                 # Foo bar
                 # Foo  Bar is now Baz
print a.variable # Foo
a.variable = "bar"
a.method(1, 2) # output:
               # in method (args): 1 2
               # in method (attributes): bar  Bar is now Baz
Foo.method(a, 1, 2) #<--- Same as a.method(1, 2).  This makes it a little more explicit what the argument "self" actually is.

class Bar(object):
    def __init__(self, arg):
        self.arg = arg
        self.Foo = Foo()

b = Bar(a)
b.arg.variable = "something"
print a.variable # something
print b.Foo.variable # Foo
76
mgilson

クラスの使用方法の簡単な例を以下に示します。あなたが金融機関であるとします。顧客のアカウントをコンピューターで管理する必要があります。したがって、これらのアカウントをモデル化する必要があります。それがクラスの出番です。クラスの操作はオブジェクト指向プログラミングと呼ばれます。クラスを使用すると、コンピューターで実世界のオブジェクトをモデル化できます。それでは、単純な銀行口座をモデル化するには何が必要ですか?残高を保存する変数と、顧客の名前を保存する変数が必要です。さらに、バランスを増減するいくつかの方法。次のようになります。

_class bankaccount():
    def __init__(self, name, money):
        self.name = name
        self.money = money

    def earn_money(self, amount):
        self.money += amount

    def withdraw_money(self, amount):
        self.money -= amount

    def show_balance(self):
        print self.money
_

これで、単純なアカウントとそのメカニズムの抽象的なモデルができました。 def __init__(self, name, money)はクラスのコンストラクターです。メモリ内にオブジェクトを構築します。新しいアカウントを開設したい場合は、クラスのインスタンスを作成する必要があります。そのためには、コンストラクターを呼び出して必要なパラメーターを渡す必要があります。 Pythonコンストラクターはクラスの名前で呼び出されます:

_spidermans_account = bankaccount("SpiderMan", 1000)
_

スパイダーマンがM.J.に新しい指輪を購入したい場合、いくらかのお金を引き出す必要があります。彼は自分のアカウントでwithdrawメソッドを呼び出します。

_spidermans_account.withdraw_money(100)
_

彼が呼び出すバランスを見たい場合:

_spidermans_account.show_balance()
_

クラスについてのすべては、オブジェクト、その属性、およびメカニズムをモデル化することです。オブジェクトを作成するには、例のようにインスタンス化します。値は、 `earn_money() 'のようなgetterおよびsetterメソッドを使用してクラスに渡されます。これらのメソッドはオブジェクト変数にアクセスします。クラスに別のオブジェクトを保存する場合は、コンストラクターでそのオブジェクトの変数を定義する必要があります。

27
MaxPowers

クラスの重要なポイントは、instanceを作成し、そのインスタンスが一連のデータをカプセル化することです。したがって、変数がクラスのスコープ内でグローバルであると言うのは間違っています。むしろ、インスタンスは属性を保持し、そのインスタンスはそのコードのいずれかで独自の属性を参照できます(self.whatever)。同様に、インスタンスを指定された他のコードは、そのインスタンスを使用してインスタンスの属性にアクセスできます。つまり、instance.whatever

3
Daniel Roseman