为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2023-09-12 18:26:44
我试图在 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   }但无论哪种方式,它都不知道类方法。我怎样才能让它按照我的方式工作?
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您可以将它们添加到构造函数中,如下所示:


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)


查看完整回答
反对 回复 2023-09-12
?
浮云间

TA贡献1829条经验 获得超4个赞

为了引用类内部实现的方法,需要以下语法:


METHODS_MAP = 

{

    'a': MyClass.a,

    'b': MyClass.b

}

因为有些函数作用于类实例而不是@classmethods,所以我们需要更改caller()函数:


from inspect import ismethod


def 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__()


查看完整回答
反对 回复 2023-09-12
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信