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

时间:2012-04-19 06:49:46

标签: python function object dictionary

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

    rooms = []
    rooms.append(Object1())
    ...
    rooms.append(Object4())

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

    dict = {'look': CallLook(rooms[i])}

然而,我能够将它传递给函数;在函数中,如果我尝试调用对象方法,它会给我带来问题

    def CallLook(current_room)
       current_room.examine()

我确信必须有更好的方法来做我想做的事情,但我是Python的新手,我还没有看到如何做到这一点的干净的例子。任何人都有一个很好的方法来实现要传递给函数的对象列表?所有对象都包含检查方法,但它们是不同类的对象。 (对不起,我早些时候没有这么说)

特定错误状态:TypeError:'NoneType'对象不可调用

6 个答案:

答案 0 :(得分:2)

  

任何人都有很好的方法来实现要传递给函数的对象列表?所有对象都包含检查方法,但它们是不同类的对象。 (对不起,我早些时候没有这么说)

这是Python的简单鸭子打字。

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,我想把对象传递给函数。但是,我遇到了一些问题。例如,我有一个字典:

my_dict = {'look': CallLook(rooms[i])} # this is no dict of functions

您创建的dict可能评估为{'look': None}(假设您的examine()未返回值。)这可以解释您观察到的错误。 如果你想要一个函数的dict,你需要放入一个可调用的函数,而不是一个实际的函数调用,例如像这样:

my_dict = {'look': CallLook} # this is a dict of functions

如果您想将'look'绑定到特定room,则可以重新定义CallLook

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方法。你不应该这样做。这会产生令人讨厌的错误。

答案 1 :(得分:0)

假设您有一个类Room,创建实例列表的常用方法是使用像这样的列表推导

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我认为有些事情你可能没有得到这个:

dict = {'look': CallLook(rooms[i])}

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

现在,您收到的错误告诉我们程序中的rooms[i] is None。{/ p>

您不需要CallLook(也称为非标准名称) - 您可以使用表达式rooms[i].examine(),或者如果您想稍后评估该呼叫rooms[i].examine

你可能根本不需要这个词。

答案 4 :(得分:0)

我不确定您的要求,但您可以使用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类的对象并将其存储在dict中。显然,在这种情况下,您可以使用list而不是dict。

答案 5 :(得分:0)

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

所以:

rooms = [Obj1(),Obj2(),Obj3()]


if hasattr(rooms[i], 'examine'):#First check if our object has selected function or attribute...
    getattr(rooms[i], 'examine') #that will just evaluate the function do not call it, and equals to Obj1().examine
    getattr(rooms[i], 'examine')() # By adding () to the end of getattr function, we evalute and then call the function...

您也可以将参数传递给examine函数,如:

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