何が起こっているのか、あなたはとても混乱していると思います。
Python では、すべてがオブジェクトです。
[]
(リスト) はオブジェクトです
'abcde'
(文字列) はオブジェクトです
1
(整数) はオブジェクトです
MyClass()
(インスタンス) はオブジェクトです
MyClass
(クラス)もオブジェクトです
list
(型 -- クラスによく似ています) もオブジェクトです
それらはすべて、物であり、物を指す名前ではないという意味で「値」です。(変数は値を参照する名前です。) 値は、Python のオブジェクトと何ら変わりはありません。
MyClass()
クラス オブジェクト (や など)を呼び出すと、list()
そのクラスのインスタンスが返されます。(list
実際にはクラスではなく型ですが、ここでは少し単純化しています。)
オブジェクトを出力する (つまり、オブジェクトの文字列表現を取得する) と、そのオブジェクトの__str__
または__repr__
マジック メソッドが呼び出され、戻り値が出力されます。
例えば:
>>> class MyClass(object):
... def __str__(self):
... return "MyClass([])"
... def __repr__(self):
... return "I am an instance of MyClass at address "+hex(id(self))
...
>>> m = MyClass()
>>> print m
MyClass([])
>>> m
I am an instance of MyClass at address 0x108ed5a10
>>>
したがって、「インスタンス情報ではなく、list() のようなリストを MyClass が返す必要がある」という要求は意味がありません。 list()
リストインスタンスを返します。MyClass()
MyClass インスタンスを返します。リスト インスタンスが必要な場合は、リスト インスタンスを取得します。代わりに、これらのオブジェクトを使用したり、コンソールで見たりしたときにどのように見えるかがprint
問題である場合は、それらを表現したいように表現する__str__
andメソッドを作成します。__repr__
平等に関する新しい質問の更新
繰り返しますが、これは印刷専用で__str__
あり、それ以外の方法でオブジェクトに影響を与えることはありません。2 つのオブジェクトが同じ値を持っているからといって、それらが等しいとは限りません。__repr__
__repr__
MyClass() != MyClass()
クラスはこれらがどのように等しいかを定義していないため、(object
型の) デフォルトの動作にフォールバックします。つまり、オブジェクトはそれ自体とのみ等しいということです。
>>> m = MyClass()
>>> m1 = m
>>> m2 = m
>>> m1 == m2
True
>>> m3 = MyClass()
>>> m1 == m3
False
これを変更したい場合は、比較マジックメソッドのいずれかを使用してください
たとえば、すべてに等しいオブジェクトを持つことができます。
>>> class MyClass(object):
... def __eq__(self, other):
... return True
...
>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1 == m2
True
>>> m1 == m1
True
>>> m1 == 1
True
>>> m1 == None
True
>>> m1 == []
True
次の 2 つのことを行う必要があると思います。
- Python でのマジック メソッドの使用に関するこのガイドをご覧ください。
list
必要なものが非常にリストに似ている場合は、サブクラス化しない理由を正当化してください。サブクラス化が適切でない場合は、代わりにラップされたリスト インスタンスに委譲できます。
class MyClass(object):
def __init__(self):
self._list = []
def __getattr__(self, name):
return getattr(self._list, name)
# __repr__ and __str__ methods are automatically created
# for every class, so if we want to delegate these we must
# do so explicitly
def __repr__(self):
return "MyClass(%s)" % repr(self._list)
def __str__(self):
return "MyClass(%s)" % str(self._list)
これは、リストでなくても (つまり、サブクラス化せずにlist
) リストのように振る舞うようになりました。
>>> c = MyClass()
>>> c.append(1)
>>> c
MyClass([1])