Python-从对象列表中调用对象

Python-从对象列表中调用对象,python,function,object,dictionary,Python,Function,Object,Dictionary,我有一个类,我希望能够创建该类的多个对象,并将它们放置在一个数组中。我是这样做的: rooms = [] rooms.append(Object1()) ... rooms.append(Object4()) 然后我有一个函数的dict,我想把对象传递给函数。然而,我遇到了一些问题。例如,我有一个口述: dict = {'look': CallLook(rooms[i])} 但是,我能够将其传递到函数中;在函数中,如果我尝试调用objects方法,它会

我有一个类,我希望能够创建该类的多个对象,并将它们放置在一个数组中。我是这样做的:

    rooms = []
    rooms.append(Object1())
    ...
    rooms.append(Object4())
然后我有一个函数的dict,我想把对象传递给函数。然而,我遇到了一些问题。例如,我有一个口述:

    dict = {'look': CallLook(rooms[i])}
但是,我能够将其传递到函数中;在函数中,如果我尝试调用objects方法,它会给我带来问题

    def CallLook(current_room)
       current_room.examine()
我确信一定有更好的方法来完成我正在尝试的工作,但我对Python还不熟悉,我还没有看到一个清晰的例子来说明如何做到这一点。有没有人有一个很好的方法来实现要传递到函数中的对象列表?所有对象都包含examine方法,但它们是不同类的对象。(对不起,我刚才没说)


具体的错误状态为:TypeError:“NoneType”对象不可调用

假设您有一个class
Room
创建实例列表的通常方法是使用如下列表理解

rooms = [Room() for i in range(num_rooms)]

假设您有一个class
Room
,通常创建实例列表的方法是使用如下列表理解

rooms = [Room() for i in range(num_rooms)]

假设您没有基本问题(例如语法错误,因为粘贴的代码不是有效的Python),此示例将向您展示如何执行所需操作:

>>> class Foo():
...    def hello(self):
...        return 'hello'
...
>>> r = [Foo(),Foo(),Foo()]
>>> def call_method(obj):
...    return obj.hello()
...
>>> call_method(r[1])
'hello'

假设您没有基本问题(例如语法错误,因为粘贴的代码不是有效的Python),此示例将向您展示如何执行所需操作:

>>> class Foo():
...    def hello(self):
...        return 'hello'
...
>>> r = [Foo(),Foo(),Foo()]
>>> def call_method(obj):
...    return obj.hello()
...
>>> call_method(r[1])
'hello'

我认为有些事情你可能无法理解:

dict = {'look': CallLook(rooms[i])}
这将创建一个
dict
,其中只有一个条目:一个键
'look'
,以及一个值,该值是在该语句点处计算
CallLook(rooms[i])
的结果。然后它还使用名称
dict
来存储此对象,因此您不能再在该上下文中将
dict
用作构造函数

现在,您得到的错误告诉我们,
rooms[i]在程序中的该点为None

您不需要
CallLook
(这也是非标准名称)-您可以使用表达式
rooms[i].inspect()
,或者如果您想稍后对调用进行求值
rooms[i].inspect


你可能根本就不需要这本词典。

我想你可能对这本书有些了解:

dict = {'look': CallLook(rooms[i])}
这将创建一个
dict
,其中只有一个条目:一个键
'look'
,以及一个值,该值是在该语句点处计算
CallLook(rooms[i])
的结果。然后它还使用名称
dict
来存储此对象,因此您不能再在该上下文中将
dict
用作构造函数

现在,您得到的错误告诉我们,
rooms[i]在程序中的该点为None

您不需要
CallLook
(这也是非标准名称)-您可以使用表达式
rooms[i].inspect()
,或者如果您想稍后对调用进行求值
rooms[i].inspect


您可能根本不需要dict。

我不确定您的要求,但您可以使用dict存储类的多个对象。 也许这会有帮助

>>> class c1():
...     print "hi"
...     
hi
>>> c = c1()
>>> c
<__main__.c1 instance at 0x032165F8>

>>> d ={}
>>> for i in range (10):
...     d[i] = c1()
...     
>>> d[0]
<__main__.c1 instance at 0x032166E8>
>>> d[1]
<__main__.c1 instance at 0x032164B8>
>>> 
>>类别c1():
...     打印“嗨”
...     
你好
>>>c=c1()
>>>c
>>>d={}
>>>对于范围(10)内的i:
...     d[i]=c1()
...     
>>>d[0]
>>>d[1]
>>> 

它将创建一个c1类的对象并将其存储在dict中。显然,在这种情况下,您可以使用list而不是dict。

我不确定您的要求,但您可以使用dict存储一个类的多个对象。 也许这会有帮助

>>> class c1():
...     print "hi"
...     
hi
>>> c = c1()
>>> c
<__main__.c1 instance at 0x032165F8>

>>> d ={}
>>> for i in range (10):
...     d[i] = c1()
...     
>>> d[0]
<__main__.c1 instance at 0x032166E8>
>>> d[1]
<__main__.c1 instance at 0x032164B8>
>>> 
>>类别c1():
...     打印“嗨”
...     
你好
>>>c=c1()
>>>c
>>>d={}
>>>对于范围(10)内的i:
...     d[i]=c1()
...     
>>>d[0]
>>>d[1]
>>> 

它将创建一个c1类的对象,并将其存储在dict中。显然,在这种情况下,您可以使用list而不是dict。

这不是必须的,但在某些情况下,使用是很好的。。。是从对象获取属性的另一种方法

因此:

您还可以将参数传递给
检查
函数,如:

getattr(rooms[i], 'examine')(param1, param2)

这不是必须的,但在某些情况下,使用是好的。。。是从对象获取属性的另一种方法

因此:

您还可以将参数传递给
检查
函数,如:

getattr(rooms[i], 'examine')(param1, param2)
有没有人有一个很好的方法来实现要传递到函数中的对象列表?所有对象都包含examine方法,但它们是不同类的对象。(对不起,我刚才没说)

这是Python的普通duck类型

class Room:
    def __init__(self, name):
        self.name = name
    def examine(self):
        return "This %s looks clean!" % self.name

class Furniture:
    def __init__(self, name):
        self.name = name
    def examine(self):
        return "This %s looks comfortable..." % self.name

def examination(l):
    for item in l:
        print item.examine()

list_of_objects = [ Room("Living Room"), Furniture("Couch"), 
                    Room("Restrooms"), Furniture("Bed") ]
examination(list_of_objects)
印刷品:

This Living Room looks clean!
This Couch looks comfortable...
This Restrooms looks clean!
This Bed looks comfortable...

至于您的具体问题:您可能忘记了从
examine()
返回一个值?(请发布完整的错误消息(包括完整的回溯)。)

然后我有一个函数的dict,我想把对象传递给函数。然而,我遇到了一些问题。例如,我有一个口述:

    dict = {'look': CallLook(rooms[i])}
您创建的
dict
的计算结果可能是
{'look':None}
(假设您的
检查()
没有返回值),这可以解释您观察到的错误。 如果您想要一个函数的dict,则需要放入一个可调用函数,而不是实际的函数调用,例如:

my_dict = {'look': CallLook} # this is a dict of functions
如果要将
'look'
绑定到特定的
房间
,可以重新定义
调用look

def CallLook(current_room)
   return current_room.examine # return the bound examine
my_dict = {'look': CallLook(room[i])} # this is also a dict of functions

代码的另一个问题是,通过命名本地字典
dict
来隐藏内置的
dict()
方法。你不应该这样做。这会产生严重的错误

有没有人有一个很好的方法来实现要传递到函数中的对象列表?所有对象都包含examine方法,但它们是不同类的对象。(对不起,我刚才没说)

这是Python的普通duck类型

class Room:
    def __init__(self, name):
        self.name = name
    def examine(self):
        return "This %s looks clean!" % self.name

class Furniture:
    def __init__(self, name):
        self.name = name
    def examine(self):
        return "This %s looks comfortable..." % self.name

def examination(l):
    for item in l:
        print item.examine()

list_of_objects = [ Room("Living Room"), Furniture("Couch"), 
                    Room("Restrooms"), Furniture("Bed") ]
examination(list_of_objects)
印刷品:

This Living Room looks clean!
This Couch looks comfortable...
This Restrooms looks clean!
This Bed looks comfortable...

至于您的具体问题:可能您忘记了返回值fr