2016-06-27 3 views
-1

Можно ли получить ключ значение filter_dict объекта типа этого filter_dict.get_keyval("author"):Вызов метода класса на объект 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, но простой dict возвращается 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-файл, и я хочу выполнить поиск объекта dict для ключа и вернуть его значение. – user6519628

Смежные вопросы