2016-06-27 8 views
-1

はそのfilter_dict.get_keyval("author")filter_dictオブジェクトの種類のキー値を取得することが可能ですしていない:?は辞書オブジェクトのクラスのメソッドを呼び出す:はAttributeError:「辞書」オブジェクトには属性「get_keyval」

import json 

class Config(dict): 
    def open_json_file(self, json_string): 
     load_dict = json.loads(json_string) 
     return load_dict 

    def get_keyval(self, key): 
     search_key = self.load_dict.get(key) 
     return search_key 

filter_dict = Config().open_json_file('{"author" : "Steve", "author_email" : ""}') 
print(filter_dict.get_keyval("author")) 

取得します:

AttributeError: 'dict' object has no attribute 'get_keyval' 

は次の回避策をしました(それは私が欲しいものではありません):

import json 

class Config(): 
    def open_json_file(self, json_string): 
     load_dict = json.loads(json_string) 
     return load_dict 

    def get_keyval(self, json_string, key): 
     search_key = json_string.get(key) 
     return search_key 

filter_dict = Config().open_json_file('{"author" : "Steve", "author_email" : ""}') 
print(Config().get_keyval(filter_dict, "author")) 
+1

クラスメソッドを正しく使用していません。クラスメソッドを呼び出すたびに、新しいクラスインスタンスを作成したくない* - それは気違いです。この場合、クラスメソッドが必要なく、静的メソッドが必要です。したがって、@ @ staticmethodデコレータを追加してから、コンストラクタを呼び出さずにメソッドを呼び出してください。 –

+0

なぜこれらのメソッドが最初に必要ですか?既存のオブジェクトの機能をラッピングするだけです。 'filter_dict = json.loads( '...')'と 'print(filter_dict.get(" author "))'はクラスを必要とせずに同等です。 – MisterMiyagi

答えて

1

Config().open_json_fileによって返されるオブジェクトのタイプはConfigではありませんが、平方根はjson.loadsによって返されます。基本的にConfigはクラスではなく、メソッドとしてコード化された関数のコレクションです。あなたが望むのはこれでしょう:

import json 

class Config(dict): # derive from dict to gain get and constructor 
    @classmethod 
    def from_json_file(cls, json_string): 
    """Initialize Config dict from a JSON string""" 
    load_dict = json.loads(json_string) 
    return cls(load_dict) # create new Config (dict) filled with JSON content 

    def get_keyval(self, key): 
    return self.get(key) 

filter_dict = Config.from_json_file(...) 
print(filter_dict.get_keyval("author")) # you might want to just call plain filter_dict.get("author") here 
+1

また、クラス定義で 'get_keyval = dict.get'を実行するだけで、メソッドのエイリアスを作成できます。 –

+0

@ TadhgMcDonald-Jensenあなたは正しいですが、私ははるかに大きなjson-fileを持っています。私はdict-objectでキーを検索し、値を返したいと思っています。 – user6519628

関連する問題