我在使用类和对象的python中遇到了一些麻烦。我有两个类,我实例化了每个类的对象。当用户键入某个字符串时,我想将这些对象传递给函数。然后该函数将调用它所使用的对象的类方法。 (这些方法对每个类都有相同的名称)。我在下面做了一个示例文件:
class Test1(object):
def method1(self):
print("test1")
class Test2(object):
def method1(self):
print("test2")
def Call(something):
return something.method1
def Call2(something):
y = input("> ")
return something.method1
array = [Test1(), Test2()]
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
x = input("> ")
if x in my_dict:
my_dict[x]()
我认为发生的是Call2()在运行时调用并请求输入。然后调用第二个input()。有人可以解释为什么Call2()运行,即使if语句没有机会评估字符串?可能有很多我误解的事情。任何帮助表示赞赏。
编辑:好的,我知道在dict声明期间会调用这些函数。在将对象传递给它的同时,如何将函数链接到dict?答案 0 :(得分:2)
问:有人可以解释为什么
Call2()
会运行,即使if语句没有机会评估字符串吗?
你在这里调用这两个函数:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
问:在将对象传递给它的同时,如何将函数链接到dict?
通常做的是提供函数和args sepatate彼此。这是一个例子:
>>> def the_caller(f, args=()):
... return f(*args)
...
>>> def present_me(name):
... return 'My name is ' + name
...
>>> the_caller(present_me, args=('Rik',))
'My name is Rik'
您的示例代码设计太差,无法构建可能有意义的内容。
答案 1 :(得分:1)
您的代码在定义字典时会调用该函数。
my_dict = {'call': (lambda: Call(array[0])), 'call2': (lambda: Call2(array[1]))}
答案 2 :(得分:1)
当你运行它时,它将到达这一行:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
这将调用Call
和Call2
- 这是调用第一个input
的位置(如果您将input
提示更改为不同的"> "
,则可以看到此信息每一个,所以你可以分辨出哪一个被调用(即而不是{{1}})。
这会澄清事情,还是你不理解的不同之处?
答案 3 :(得分:0)
使用你的原始代码以及许多额外的东西,这应该做你想做的事情:
class Test1(object):
def method1(self):
print("test1")
class Test2(object):
def method1(self):
print("test2")
my_dict = {'call': Test1(), 'call2': Test2()}
x = input("> ")
if x in my_dict:
my_dict[x].method1()