Python—将不同类的对象传递到函数中
我在python的类和对象方面遇到了一些问题。我有两个类,每个类都实例化了一个对象。我想在用户键入某个字符串时将这些对象传递到函数中。然后,该函数将调用它接受的对象的类方法。(每个类的方法具有相同的名称)。我在下面制作了一个示例文件:Python—将不同类的对象传递到函数中,python,class,object,dictionary,Python,Class,Object,Dictionary,我在python的类和对象方面遇到了一些问题。我有两个类,每个类都实例化了一个对象。我想在用户键入某个字符串时将这些对象传递到函数中。然后,该函数将调用它接受的对象的类方法。(每个类的方法具有相同的名称)。我在下面制作了一个示例文件: class Test1(object): def method1(self): print("test1") class Test2(object): def method1(self):
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()。有人能解释一下为什么即使if语句没有机会计算字符串,Call2()也会运行吗?我可能误解了很多事情。感谢您的帮助
EDIT:好的,我知道函数是在dict声明期间调用的。在将对象传递给dict的同时,如何将函数链接到dict?您的代码在定义dict时调用函数
my_dict = {'call': (lambda: Call(array[0])), 'call2': (lambda: Call2(array[1]))}
您的代码在定义dict时调用该函数
my_dict = {'call': (lambda: Call(array[0])), 'call2': (lambda: Call2(array[1]))}
问:有人能解释一下为什么即使if语句没有机会计算字符串,也会运行Call2()
您在此处调用这两个函数:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
问:在将对象传递给dict的同时,如何将函数链接到dict
通常所做的是提供函数,并且参数彼此分离。下面是一个例子:
>>> 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'
您的示例代码设计得太糟糕,无法构建有意义的东西
问:有人能解释一下为什么即使if语句没有机会计算字符串,也会运行Call2()
您在此处调用这两个函数:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
问:在将对象传递给dict的同时,如何将函数链接到dict
通常所做的是提供函数,并且参数彼此分离。下面是一个例子:
>>> 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'
您的示例代码设计得太糟糕,无法构建有意义的东西。运行此命令时,它将到达以下行:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
这将调用call
和Call2
——这是调用第一个输入
的地方(如果您将输入
提示更改为不同的提示,则可以看到这一点,这样您就可以知道调用的是哪一个(即,而不是“>”
)
这是否澄清了问题,或者是您不理解的其他问题?当您运行此程序时,它将到达以下行:
my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}
这将调用call
和Call2
——这是调用第一个输入
的地方(如果您将输入
提示更改为不同的提示,则可以看到这一点,这样您就可以知道调用的是哪一个(即,而不是“>”
)
这是澄清了问题,还是你不理解的地方有所不同?使用你的原始代码和大量额外的内容,这应该可以做你想做的事情:
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()
使用您的原始代码和大量额外的内容,这应该可以完成您想要做的事情:
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()
这很有意义,谢谢。我只需要一种方法在dict中声明它而不调用它。@user1343005,如果我理解正确,您希望在不调用函数的情况下将函数绑定到特定参数。一种方法是创建一个新函数,使用
lambda
像这样:my_dict={'call:lambda:call(数组[0]),“call2”:lambda:call2(数组[1])}
。请参阅。这很有意义,谢谢。我只需要一种方法在dict中声明它而不调用它。@user1343005,如果我理解正确,您希望在不调用函数的情况下将函数绑定到特定参数。一种方法是使用lambda
创建新函数,如下所示:my_dict={'call':lambda:call(数组[0]),'call2':lambda:call2(数组[1])
。请参阅。谢谢,但我的目的是字符串告诉对象调用哪个方法。因此,稍后的事件可以更改对象,然后字符串将链接到新对象,调用相同名称的方法谢谢,但我的目的是字符串告诉对象调用哪个方法。因此,稍后的事件可以更改对象t、 然后字符串将链接到新对象,调用相同名称的方法