2016-03-31 25 views
-2

私は一般的にPythonとOOPの新機能です。私は非常に簡単な質問をしているだけで私のために働くことはありません。 私はいくつかの機能を持つクラスを持っています。Python:クラス内の別の関数から変数を呼び出す

class Test: 

    def a(self): 
     var1 = 1 
     return var1 

    def b(self): 
     var2 = 2 
     return var2 

    def c(self): 
     var3 = a() 
     var4 = b() 

なぜ、これはちょうど私が、私はいくつかの重要な基本的な知識が不足しています推測、それは()またはb() を知らないことを私に教えてくれます。 おかげ

私が参照のうえ午前実際に:

class Token: 
    # get new token 
    def post_new_token(self): 
     payload = "***" 
     headers = { 
      'authorization': "***", 
      'content-type': "application/x-www-form-urlencoded" 
     } 
     r = requests.post(settings.GET_NEW_TOKEN, data=payload, headers=headers) 
     r_json_obj = r.json() 
     # print ("I am from post_new_token:") 
     # print r_json_obj 
     return r_json_obj 

    # use the new token 
    def get_config(self): 
     # here I want to use the returned value: 
     access_token = self.post_new_token() 
     headers = { 
      'authorization': "Bearer " + str(access_token), 
      'cache-control': "max_age 3600" 
     } 
     r = requests.get(settings.GET_CONFIG, headers=headers) 
     # print ("I am from get_config:") 
     # print access_token 
     return r 

だから、実際に罰金行くが、それは()self.post_new_tokenことを得るとき、それは再びすべてこの機能を実行するプリントを使用している場合。

私はこのようにそれを得ることが起こっていただきました!見にプリントを使用している場合があり、エラーが来ていないが、:

I am from post_new_token: 
{***} 
I am from get_config: 
{***} 
I am from post_new_token: 
{***} 

は、なぜそれが再び

I am from post_new_token: 
{***} 

を印刷していますか?

+0

'b 'に' self.a() 'を使用する必要があります。理由を知るには、[classes](https://docs.python.org/3/tutorial/classes.html#classes)のチュートリアルのセクションを読むことをお勧めします。慎重にそれを読んで、あなたの誤解がどこにあるのかを見ておくことは、あなたの時間の価値があるでしょう。 – idjaw

+0

私は実際のコードでそれを行いました。しかし、それは全体の機能をスローし、この機能に含まれるものを印刷します。しかし、私は返された内容を使用したいだけで、関数のすべてではありません。 – buchstabe

+0

そして "def"を参照しないでください。それらは関数と呼ばれ、クラス内にあるときはここではメソッドと呼ばれます。 –

答えて

2

インスタンスメソッドを呼び出す場合や、他のインスタンスメソッドから名前(インスタンス変数)にアクセスする場合は、selfを使用する必要があります。

def c(self): 
    var3 = self.a() 
    var4 = self.b() 
1

の代わりに:

def c(self): 
    var3 = a() 
    var4 = b() 

私がしようとするだろう:

def c(self): 
    var3 = self.a() 
    var4 = self.b() 
+0

良い答え!おそらく、従来の 'self'の使い方、ローカルとグローバルの名前空間の違い、* why *' a'が範囲外であることを説明する散文を追加することができます。また、正しくインデントすることを忘れないでください。回答のコードが実行されない場合、OPは残りの回答を信じていない可能性があります。 –

0

さんが最初にこのケースを見てみましょう:

class Test: 
    def a(self): 
     var1 = 1 
     return var1 

    def b(self): 
     var2 = 2 
     return var2 

あなたがクラスをインスタンス化する場合:

その後、0
test_obj = Test() 

され、どのようなaまたはb参照してみてください:

print test_obj.a 
>>> <bound method Test.a of <so.Test instance at 0x18B9B648>> 
print test_obj.b 
>>> <bound method Test.b of <so.Test instance at 0x18B9B648>> 

お知らせ - それはTestのインスタンスの方法をバインド言います。これらのメソッドはインスタンスにバインドされています。インスタンスでのみ使用できます。ちなみに、あなたは今までにselfが何だったのか疑問に思ったことがあります。なぜ、クラスのインスタンスメソッドに渡す必要があるのですか?あなたはこのようなクラスを書き直すことができましたか(推奨されていません。自己を使用してください)。

class Test: 
    def a(instance): #a belongs to that instance 
     var1 = 1 
     return var1 

    def b(instance): 
     var2 = 2 
     return var2 

同じように動作しますか?

def a(instance): 
    print instance 
    var1 = 1 
    return var1 

そして方法Aをプリントアウトし、メソッドを呼び出してみました:あなたもそうのように、aprint instanceを追加した場合は

print test_obj.a 
>>> <bound method Test.a of <so.Test instance at 0x18B9B3C8>> # Notice memory address 
test_obj.a() # Remember we added print instance here 
>>> <so.Test instance at 0x18B9B3C8> # Address is the same 

をこれはちょうど、これらのメソッドは、バウンドしていることのポイントを説明することでしたインスタンスへ、したがって、あなたがその特定のインスタンスを使用する必要がそれらを使用する:

class Test: 
    # This function is in the scope of the class 
    def a(self): 
     var1 = 1 
     return var1 

    # This function is in the scope of the class 
    def b(self): 
     var2 = 2 
     return var2 

    def c(self): 
     # a() and b() are not defined in this scope, 
     # to use them you would have to define them again here (within the scope of c). 
     # def a(): 
     #  return 1 
     # def b(): 
     #  return 2 
     # Your methods are bound to self (current instance) 
     var3 = self.a() 
     var4 = self.b() 

をとcを呼び出すときには、もう一度インスタンスを使用してください。test_obj.c()

関連する問題