69742


以下のプログラムで質問です。（WebAPIを取得するプログラムです）

メインクラスである add クラスで、引数を指定してインスタンスオブジェクトを生成していますが、その際、引数として `address['zipcode']`
のように、`address` をつけているのはなぜでしょうか？

`address` を書かずに以下の記述でもいい様な気がします。

[code]

    add = Address(
    'zipcode',
    'address1',
    'address2',
    'address3')
    
[/code]

もともと Address クラスのでイニシャライズの引数が `(self, zipcode, address1, address2, address3)`
となっているから、上の様に考えます。

[追加で質問です]

[code]

    add = Address(\
                  address['zipcode'], 
                  address['address1'],
                  address['address2'],
                  address['address3'])
    
    
[/code]

このインスタンスオブジェクトを生成する際に、引数である'zipcode'に具体的な数値である郵便番号7桁を書いたら、以下の様なエラーが出てしまいます。「Keyerror」  
引数に7桁の番号を指定したら、Addreessクラスのイニシャライザの引数として認識されると思うのですが。。

[code]

    import requests
    import json
     
    # 郵便番号取得
    class Address:
     
        def __init__(self, zipcode, address1, address2, address3):
            self.zipcode = zipcode
            self.address1 = address1
            self.address2 = address2
            self.address3 = address3
     
        def get_address(self):
            # TODO
            # display_address = f'住所 {self.zipcode} {}{}{}'
            display_address = f'住所 {self.zipcode} {self.address1}{self.address2}{self.address3}'
            return display_address
     
    # オブジェクトの責務をはっきりさせる。オブジェクト自体は最小限にする
    # Addressクラスは住所情報を扱う
    # Addressクラスは通信を行わない
    # ZipcloudAPIクラスは通信を行う
    # ZipcloudAPIクラスはAddressクラスを生成する情報を持っている
    # ZipcloudAPIクラスはzipcloud apiを使う
    # AddressValidaterはAddressクラスが持つ情報の整合性をチェックする
     
    # zipcodeの入力
    zipcode = 9608141
     
    #zipcloudから住所情報を取得
    url = "https://zipcloud.ibsnet.co.jp/api/search"
    params = {"zipcode": zipcode}
    res = requests.get(url, params=params)
    response_json = res.json()
    result = response_json["results"]
    address = results[0]  # 物によっては複数返ってくることがある
    # print(addess)]
    #コメントアウトはコマンド＋スラッシュ
     
    # Addressのインスタンスを生成する
    # print(f"住所:{address['zipcode']}{address['address1']}{address['address2']}{address['address3']}")
    add = Address(\
                  address['zipcode'], 
                  address['address1'],
                  address['address2'],
                  address['address3'])
    result = add.get_address()
    print(result)
    
[/code]


CC BY-SA 4.0
2020-08-20T16:13:58.117
69734
2020-08-21T02:15:14.987
2020-08-21T02:15:14.987
39688
39688
question
python
インスタンスオブジェクトを生成する際の引数の書き方に理解ができません


`Address`クラスのインスタンスがどういうデータを保持したいのかをまず考えます。おそらく、zipcloud から得た住所を保持したいのでしょう。

[code]

    add = Address(
      'zipcode',
      'address1',
      'address2',
      'address3')
    
[/code]

このように書いてしまうと、zipcloud
の結果はいっさい無視して、この`Address`インスタンスは常に固定のデータを保持します。固定の文字列を渡しているからです。  
`add.get_address()` の結果は `'住所 zipcode address1address2address3'` となるでしょう。

保持したいのは zipcloud の結果でしょうから、zipcloud の結果が入っているdict変数 `address`
から値を取り出して`Address()`に渡しているのです。


CC BY-SA 4.0
2020-08-21T01:33:00.013
69742
2020-08-21T01:33:00.013
3475
69734
answer