

以下のプログラムで質問があります。インスタンスを生成する際に、引数に「5670031」を指定しているにも関わらず、以下のエラーが出ます。

[code]

    ”NameError: name 'zipcode' is not defined”
    
[/code]

Addressクラスのイニシャライザで、引数を受け取ったら、それをzipcodeとして認識するとかき、その次の関数でそれをzipcodeに指定しているのに、この様なエラーが出るのが謎です。

[追加で質問です]  
print(f"住所:{address['zipcode']}{address['address1']}{address['address2']}{address['address3']}")

このコードで、なぜ「f」を書く必要があるのでしょうか？

[code]

    import  requests
    import json
    
    #郵便番号取得
    class Address:
    
        def __init__ (self,zipcode):
        
            self.zipcode=zipcode
    
        def get_address(self):
            url="https://zipcloud.ibsnet.co.jp/api/search"
            params={"zipcode":zipcode}
    
            res=requests.get(url,params=params)
           # print(res.text)
            
            results=response["results"]
            address=results[0]  #物によっては複数返ってくることがある
            print(f"住所:{address['zipcode']}{address['address1']}{address['address2']}{address['address3']}")  
    
    add=Address("5670031")
    result=add.get_address()
    
    print(result)
    
[/code]


CC BY-SA 4.0
2020-08-21T02:11:53.460
69743
2020-08-21T02:35:50.347
2020-08-21T02:35:50.347
39688
39688
question
python
イニシャライズの際に指定した引数がうまく反応しません


下記は特に意味のないコードですが、わかりやすさのために次のようにコードを短くしてみましょう。

[code]

    class Address:
        def __init__ (self,zipcode):
            self.zipcode=zipcode
    
        def get_address(self):
            params={"zipcode":zipcode}
    
    add=Address("5670031")
    result=add.get_address()
    
    print(result)
    
[/code]

> NameError: name 'zipcode' is not defined

というエラーが出ます。では、エラーが出ないように修正してみましょう。

[code]

    class Address:
        def __init__ (self,zipcode):
            self.zipcode=zipcode
    
        def get_address(self):
            params={"zipcode":self.zipcode}
    
    add=Address("5670031")
    result=add.get_address()
    
    print(result)
    
[/code]

どこが違うかお気づきになられたでしょうか。`get_address`メソッド内の `zipcode` を `self.zipcode`
にかえています。プロパティにアクセスする場合は `self.` を通してアクセスしましょう。

コードの中のあちこちに同名で `zipcode` が出てきますが、スコープやPython独自の書き方のルールなどを意識して、いま自分がどの
`zipcode` にアクセスしたいのかを考えてコーディングしてください。

つまり

>
> Addressクラスのイニシャライザで、引数を受け取ったら、それをzipcodeとして認識するとかき、その次の関数でそれをzipcodeに指定しているのに

この認識が間違いです。イニシャライザの引数 `zipcode` のスコープはイニシャライザの中だけです。 **受け取った値**
を他のメソッドから参照したいがために `self.zipcode=zipcode`
とプロパティに代入しているのです。オブジェクト指向ははじめは慣れないと思いますが、使い方に慣れていくとよいと考えます。


CC BY-SA 4.0
2020-08-21T02:22:30.303
69745
2020-08-21T02:33:34.980
2020-08-21T02:33:34.980
9008
9008
69743
answer