字典键的方法

时间:2015-11-22 22:51:09

标签: python dictionary

在这个例子中,我想用命令做一个菜单(添加2个数字和2个数字)。我想用一个字典来做这个,我想要为方法addsub分配键值。当我调用方法UI时,会调用键值。如何解决?

class Calc():
    def __init__(self):
        pass
    def add(self):
        a = int(input("Number a is:"))
        b = int(input("Number b is:"))
        return a + b
    def sub(self):
        a = int(input("Number a is:"))
        b = int(input("Number b is:"))
        return a + b
    def UI(self):
        Options = {1:self.add(), 2:self.sub()}

n = Calc()
n.UI()

3 个答案:

答案 0 :(得分:1)

我建议不要向dict添加函数调用,因为它可能会给代码增加混乱。但是,如果必须这样做,您可以存储指向函数的指针。

    Options = {1:self.add,
               2:self.sub
              }

可以称之为

选项1

基于原始代码的快速工作示例:

class Calc():
    def __init__(self):
        pass
    def add(self):
        a = int(input("Number a is:"))
        b = int(input("Number b is:"))
        return a + b
    def sub(self):
        a = int(input("Number a is:"))
        b = int(input("Number b is:"))
        return a + b
    def UI(self, option):
        Options = {1:self.add,
                   2:self.sub
                  }
        return Options[option]()

n = Calc()
n.UI(1)
Number a is:1
Number b is:1
2

答案 1 :(得分:1)

代码:

add

在创建字典时实际调用subUI()方法一次。您希望在用户从菜单中选择一个选项时调用这些方法。您可以使用此 def UI(self): options = {1:self.add, 2:self.sub} while True: # get user selection selection = input("1. add\n2: subtract\nSelection: ") if selection.lower().startswith('q'): # any input starting with "Q" or "q" quits break # call method corresponding to the user's selection result = options[int(selection)]() # error handling omitted print("Result: {}".format(result)) 方法代替:

sub()

P.S。您的import operator class Calc: def my_div(self, a, b): return a / float(b) # ensure float division def UI(self): options = {1: operator.add, 2: operator.sub, 3: self.my_div,} while True: # get user selection selection = input("1. add\n2: subtract\n3: divide\nq: quit\nSelection: ") if selection.lower().startswith('q'): # any input starting with "Q" or "q" quits break selection = int(selection) if selection not in options: print("Invalid selection, try again") continue # get arguments to pass to operation a = int(input("Number a is:")) b = int(input("Number b is:")) # call method corresponding to the user's selection result = options[selection](a, b) # error handling omitted print("Result: {}".format(result)) 方法实际上已添加。

<强>更新

现在要求将各种操作的参数传递给方法。这意味着必须在方法外部收集参数。这是一种这样的方式:

add()

这是可选的,但您不再需要定义自己的sub()operator等方法。您可以简单地使用options = {1: (operator.add, 2), 2: (operator.sub, 2), 3: (self.my_div, 2), 4: (operator.neg, 1), # N.B. unary operator } 模块提供的模块,如上所示,或者您也可以实现自己的模块,如上所示。

这假设所有操作都需要相同数量的参数。如果不是这种情况,那么您可以将字典设置为包含具有函数和所需参数数量的元组:

# get arguments to pass to operation
function, n_args = options[selection]
args = [int(input("Number {} is:".format(i+1))) for i in range(n_args)]

然后,当你从用户那里得到论据时:

result = function(*args)

最后,调用方法:

public class SettingsFragment extends PreferenceFragment {

    final static String TAG = "Preferance Fragment";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

将解包参数并将它们传递给相应的函数。

答案 2 :(得分:0)

首先,您需要将字典更改为以下内容:

options = {1:self.add, 2:self.sub}

所以当dict被装箱时,python不会调用方法,而是将方法引用存储在options中作为值。

现在你可以通过调用

来调用(即执行)options中的方法
options[some_key]()

或(如你所愿)

options[1]() #add
options[2]() #sub