2

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

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

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

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

但是,我可以将它传递给函数;在函数中,如果我尝试调用对象方法,它会给我带来问题

    def CallLook(current_room)
       current_room.examine()

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

具体错误状态:TypeError: 'NoneType' object is not callable

4

6 回答 6

3

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

这是 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()?(请发布完整的错误消息(包括完整的回溯)。)

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

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

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

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

于 2012-04-19T08:07:07.417 回答
1

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

>>> class Foo():
...    def hello(self):
...        return 'hello'
...
>>> r = [Foo(),Foo(),Foo()]
>>> def call_method(obj):
...    return obj.hello()
...
>>> call_method(r[1])
'hello'
于 2012-04-19T06:56:46.343 回答
0

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

rooms = [Room() for i in range(num_rooms)]
于 2012-04-19T06:55:15.517 回答
0

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

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

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

现在,你得到的错误告诉我们rooms[i] is None在程序中的那个时候。

您不需要CallLook(这也被非标准命名) - 您可以只使用表达式rooms[i].examine(),或者如果您想稍后评估调用rooms[i].examine

你可能根本不需要字典。

于 2012-04-19T07:23:52.833 回答
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。

于 2012-04-19T07:49:25.960 回答
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)
于 2012-04-19T07:51:41.793 回答