2014-10-07 2 views
0

Я пытающийся использовать Dict для управления выбором функции внутри класса, однако, я получаю эту следующую TypeError:Pythonic переключение с использованием функций внутри класса

TypeError: A() missing 1 required positional argument: 'self' 

Примера код:

class Tt: 
    def __init__(self): 
     pass 
    def A(self): 
     print("a") 
    def B(self): 
     print("b") 
    def C(self): 
     print("c") 

    a_diction={ 
     '0' : A, 
     '1' : B, 
     '2' : C 
    } 

    def ad(self,data): 
     self.a_diction[data]() 

Как я могу построить этот переключатель в ad, чтобы предоставить self как a_diction, так и вызванному методу A, B и C?

ответ

3

Сообщение об ошибке указывает, что вам не хватает аргумента. Я предлагаю добавить аргумент.

self.a_diction[data](self) 
+0

Да, это работает .... но почему это сработало? логически это должно было быть self. (Self.a_diction [данные])() .. это неправильно я знаю .. , но передача себя в качестве аргумента здесь работает .. почему так? – user3007395

+0

@ user3007395 Можете ли вы опубликовать свой фактический код в вопросе? Код, который находится там, где он находится, не будет работать, даже с этим добавлением. – mfitzp

+0

Это работает, потому что 'someObject.method()' также можно вызвать с помощью синтаксиса 'someClass.method (someObject)'. Точно так же работают 'self.thing()' и 'thing (self)'. – Kevin

1

Не могли бы вы сделать следующее вместо этого?

class Tt: 
    def __init__(self): 
     self.a_diction = { 
      0: self.A, 
      1: self.B, 
      2: self.C 
     } 

    def A(self): 
     print("a") 

    def B(self): 
     print("b") 

    def C(self): 
     print("c") 

    def ad(self,data): 
     self.a_diction[data]() 

есть, сделать a_diction атрибут экземпляра и инициализировать его в __init__? Затем вы можете выбирать связанные методы как значения в словаре вместо несвязанных методов.

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