在这个例子中,我想用命令做一个菜单(添加2个数字和2个数字)。我想用一个字典来做这个,我想要为方法add
和sub
分配键值。当我调用方法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()
答案 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
在创建字典时实际调用sub
和UI()
方法一次。您希望在用户从菜单中选择一个选项时调用这些方法。您可以使用此 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