Ваш foo
метод должен вызываться для экземпляра Demo
, а не сам по себе. В обеих версиях вашего кода вызов foo
без поиска чего-либо (вероятно, экземпляра) является ошибкой.
Возможно, вы хотите:
def foo(self, key):
obj = Demo(self[key])
obj.foo(key)
Это будет работать какПока ваши данные имеют вложенные словари под одним и тем же ключом. Сбой, когда self[key]
не возвращает словарь. Предположительно, вы хотите иметь базовый случай, чтобы справиться с этим:
def foo(self, key):
value = self[key] # you might want a further base case to handle the key not existing at all!
if not isinstance(value, dict):
pass # if you have something to do for the base case, do it here
else: # recursive case
obj = Demo(value)
obj.foo(key)
Теперь этот класс немного глуп, он копирует много вещей просто так, чтобы вы могли иметь метод, который работает на dict
,Гораздо более разумный подход позволил бы избавиться от класса и просто использовать рекурсивную функцию с двумя аргументами, и вам не нужно создавать obj
в рекурсивном случае:
# this foo is a top-level function, not part of a class!
def foo(data, key): # no self argument any more
value = data[key]
...
foo(value, key) # recursive call is simpler now