如何在类中使用 dict 作为 switch 语句

我试图在 python 类中使用 dict 作为 switch 语句,如下所示:


class MyClass:

    METHODS_MAP = {}  # I want to place map here


    # some code here

    def caller(self, instructions):

        methods_map = {

            "a": self.a,

            "b": self.b

        }

        for key, value in instructions.items():

            methods_map[key](value)


    def a(self, val):

        print("Called a")


    def b(self, val):

        print("Called b")



a = MyClass()

instr = {"b": 12, "a": 14}

a.caller(instr)

现在它工作得很好,但我需要将methods_map方法定义放置在与静态变量相同的级别,正如有些人可能会说的那样。我试过这个:


class MyClass:

    METHODS_MAP = {

        "a": self.a

   }

或者


class MyClass:

    METHODS_MAP = {

        "a": a

   }

但无论哪种方式,它都不知道类方法。我怎样才能让它按照我的方式工作?


眼眸繁星
浏览 93回答 2
2回答

慕尼黑的夜晚无繁华

您可以将它们添加到构造函数中,如下所示:class MyClass:    def __init__(self):        self.methods_map = {            "a": self.a,            "b": self.b        }    def caller(self, instructions):        for key, value in instructions.items():            self.methods_map[key](value)    def a(self, val):        print("Called a")    def b(self, val):        print("Called b")x = MyClass()instr = {"b": 12, "a": 14}x.caller(instr)

浮云间

为了引用类内部实现的方法,需要以下语法:METHODS_MAP = {    'a': MyClass.a,    'b': MyClass.b}因为有些函数作用于类实例而不是@classmethods,所以我们需要更改caller()函数:from inspect import ismethoddef caller(self, instructions):    for key, value in instructions.items():        if METHODS_MAP[key].__self__ is MyClass: # check if function is class method            METHODS_MAP[key](MyClass, value)        elif ismethod(METHODS_MAP[key]): # check if method is an instance method            METHODS_MAP[key](self, value)        else: # static method            METHODS_MAP[key](value)如果所需的函数不是@classmethod,self将传递给它。否则,它将像往常一样被调用重要提示:虽然这个解决方案看起来比MEHTODS_MAP在__init__()函数内初始化字典更复杂,但它的成本要低得多。使用此方法,该类拥有的实例数量不会影响在内存中创建的次数METHODS_MAP(始终只有一个)。使用此处建议的其他方法(使用),将不必要地创建副本__init__()的每个实例,因为它是在函数内部初始化的MyClass()METHODS_MAP__init__()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python