2

クラスがあり、そのクラスの複数のオブジェクトを作成して配列に配置できるようにしたいと考えています。私はそれを次のようにしました:

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

次に、関数の辞書があり、オブジェクトを関数に渡したいと思います。ただし、いくつかの問題が発生しています。たとえば、口述があります。

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

ただし、関数に渡すことはできます。オブジェクトメソッドを呼び出そうとすると、関数で問題が発生します

    def CallLook(current_room)
       current_room.examine()

私がやろうとしていることを行うためのより良い方法が必要であると確信していますが、私はPythonを初めて使用し、これを行う方法の明確な例を見たことがありません. 関数に渡されるオブジェクトのリストを実装する良い方法はありますか? すべてのオブジェクトに inspect メソッドが含まれていますが、それらは異なるクラスのオブジェクトです。(先に言えなくてごめんなさい)

特定のエラー状態: TypeError: 'NoneType' object is not callable

4

6 に答える 6

3

関数に渡されるオブジェクトのリストを実装する良い方法はありますか? すべてのオブジェクトに inspect メソッドが含まれていますが、それらは異なるクラスのオブジェクトです。(先に言えなくてごめんなさい)

これは 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

コードのもう 1 つの問題は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

私はあなたがこれについて得ていないかもしれないいくつかのことがあると思います:

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

これにより、キーと、そのステートメントのポイントで評価した結果である値dictの1つのエントリだけでが作成されます。また、名前を使用してこのオブジェクトを格納するため、そのコンテキストでコンストラクターとして使用することはできなくなります。'look'CallLook(rooms[i])dictdict

さて、あなたが得ているエラーはrooms[i] is None、プログラムのその時点でそれを私たちに教えてくれます。

必要はありませんCallLook(非標準の名前も付けられています)。式を使用するrooms[i].examine()か、後で呼び出しを評価する場合に使用できますrooms[i].examine

おそらく、口述はまったく必要ありません。

于 2012-04-19T07:23:52.833 に答える
0

クラスがあると仮定するとRoom、インスタンスのリストを作成する通常の方法は、このようなリスト内包表記を使用することです

rooms = [Room() for i in range(num_rooms)]
于 2012-04-19T06:55:15.517 に答える
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 に格納します。明らかに、この場合、dict の代わりに list を使用できます。

于 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 に答える