2014-11-08 2 views
1

У меня есть следующий класс:круговая зависимость в конструкторе класса

class CustomDictionary(dict): 
    def __init__(self, val, *args, **kwargs): 
     self.wk = val 
     super(dict, self).__init__() 

    def __setattr__(self, key, value): 
     if key in self.wk: 
      raise Exception("Wrong key", "") 

     key = key.replace(" ", "_") 
     self.__dict__[key] = value 


def main(): 
    wrong_keys = ("r23", "fwfew", "s43t") 

    dictionary = CustomDictionary(wrong_keys) 

    dictionary["a1"] = 1 

Как вы можете видеть, я создаю атрибут wk в constructor. Но у меня есть функция __setattr__, в которой я работаю с атрибутом wk. Однако CustomDictionary object не имеет атрибута wk.

+0

супер (Dict, самостоятельная) .__ INIT __() sould также будет супер (ДИКТ, самость) .__ инициализации __ (* ARGS ** kwargs) –

+0

@Apero, спасибо за информацию. – Denis

ответ

1

__setattr__ - это боль, потому что она называется для каждого присваивания члену экземпляра. Возможно, самый простой исправление для вашей ситуации является определение пустой wk перед __init__:

class CustomDictionary(dict): 

    wk = [] 

    def __init__(self, val, *args, **kwargs): 
     self.wk = val 
     ... 
+0

спасибо. Оно работает. – Denis

+0

Но не все ли экземпляры CustomDictionary заканчиваются тем же самым self.wk, если вы это сделаете? –

+0

@Apero: Хороший вопрос! В этом случае нет, потому что 'wk' заменяется на' __init__', а не мутируется. –

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