66

作業中のプログラムをクラス内の関数に書き直したところ、すべてが台無しになりました。

まず__init__クラスのセクションで、self.variable=something.

その関数で使用して、クラスのすべての関数でこれらの変数にアクセス/変更できるようにする必要がありself.variableますか? つまり、これらの変数を作成したことを宣言することによってself.variable、クラスのスコープ内でグローバル変数になりますよね?

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

次に、クラスに引数を正しく渡すにはどうすればよいですか?

第三に、クラスのスコープ外でクラスの関数を呼び出すにはどうすればよいですか?

class INITIALCLASS第 4に、別の のインスタンスを作成し、class 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んでした。クラスのインスタンスを適切に作成する方法もおそらく理解していませんでした。一般的に、私はクラスの仕組みを理解していませんでしたので、私を助けて、わからないように説明してください(私にはわからないようです)。または、詳細なビデオまたは読みやすいチュートリアルを教えてください。

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

もしよろしければ、元のコードをお送りすることもできますが、かなり長いです。

4

3 に答える 3

116
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
于 2012-07-10T21:07:50.440 に答える
42

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

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)

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

spidermans_account.withdraw_money(100)

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

spidermans_account.show_balance()

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

于 2012-07-10T21:33:28.067 に答える
7

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

于 2012-07-10T21:09:59.127 に答える