我有一个类,我希望能够创建该类的多个对象并将它们放在一个数组中。我是这样做的:
rooms = []
rooms.append(Object1())
...
rooms.append(Object4())
然后我有一个函数的dict,我想把对象传递给函数。但是,我遇到了一些问题。例如,我有一个字典:
dict = {'look': CallLook(rooms[i])}
然而,我能够将它传递给函数;在函数中,如果我尝试调用对象方法,它会给我带来问题
def CallLook(current_room)
current_room.examine()
我确信必须有更好的方法来做我想做的事情,但我是Python的新手,我还没有看到如何做到这一点的干净的例子。任何人都有一个很好的方法来实现要传递给函数的对象列表?所有对象都包含检查方法,但它们是不同类的对象。 (对不起,我早些时候没有这么说)
特定错误状态:TypeError:'NoneType'对象不可调用
答案 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)