値を返すPythonクラス
selfではなく値を返すクラスを作ろうとしています。
リストと比較した例をお見せしましょう:
>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>> pass
>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>
MyClassはインスタンス情報ではなく、list()
が返すようなリストを返す必要があります。listのサブクラスを作れることは知っています。しかし、サブクラスを作らずにそれを行う方法はあるのでしょうか?
私はリスト(または他のオブジェクト)を真似したいのです:
>>> l1 = list()
>>> l2 = list()
>>> l1
[]
>>> l2
[]
>>> l1 == l2
True
>>> class MyClass():
def __repr__(self):
return '[]'
>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1
[]
>>> m2
[]
>>> m1 == m2
False
m1 == m2` はなぜ偽なのですか?これが質問です。
すべての方にお返事できなくて申し訳ありません。皆さんから頂いた解決策は全て試しています。setitemやgetitemなどの関数を使う必要があるので、def
は使えません。
13
5
何が起きているのか、あなたはとても混乱しているのだと思う。
Pythonでは、すべてがオブジェクトです:
MyClass()
(インスタンス) はオブジェクトである。これらはすべてquot;values"であり、モノを指す名前ではないという意味である。(Pythonでは値はオブジェクトと異なるものではありません。
クラスオブジェクト(
MyClass()
やlist()
など)を呼び出すと、そのクラスのインスタンスが返されます。(list
は実際にはクラスではなく型ですが、ここでは少し単純化しています)。オブジェクトを print する (オブジェクトの文字列表現を取得する) と、そのオブジェクトの
__str__
または__repr__
マジックメソッド が呼び出され、返された値が表示されます。例えば
つまり、あなたが求めていること、「MyClassがインスタンス情報ではなく、list()のようなリストを返す必要がある」ということは、何の意味もなさないということです。 list()
はリストのインスタンスを返します。MyClass()
は MyClass のインスタンスを返します。リストのインスタンスが欲しければ、リストのインスタンスを取得すればいい。もし、これらのオブジェクトをprint
したり、コンソールで見たりしたときにどのように見えるかが問題なのであれば、__str__
メソッドと__repr__
メソッドを作って、あなたが表現したいようにオブジェクトを表現してください。等式に関する新しい質問のための更新
繰り返しますが、
__str__
と__repr__
は printing のためだけのものであり、それ以外の方法でオブジェクトに影響を与えることはありません。2つのオブジェクトの__repr__
の値が同じだからといって、それらが等しいとは限りません!MyClass() != MyClass()
なぜなら、あなたのクラスはこれらがどのように等しくなるかを定義していないので、(
オブジェクト`型の)デフォルトの動作、つまりオブジェクトはそれ自身と等しいという動作に戻ってしまうからです:これを変更したい場合は、比較マジックメソッドの1つを使用してください。
例えば、すべてと等しいオブジェクトを持つことができます:
私は2つのことをすべきだと思います:
1.Python におけるマジックメソッドの使い方](https://rszalski.github.io/magicmethods/) を見てください。 2.2.
list
をサブクラス化しない理由を説明してください。サブクラス化が適切でない場合は、代わりにラップされたリストのインスタンスに委譲することができます:もし、
list
をサブクラス化することなく、クラスをリスト化したいのであれば、リストを返すメソッドを作ればいい:もし
print MyClass()
がリストを表示するという意味であれば、__repr__
をオーバーライドすればよい:EDIT: オブジェクトを比較するという意味ですね。そのためには
__cmp__
メソッドをオーバーライドします。__new__
を使用して、クラスから値を返します。他の人が
__repr__
、__str__
、または__init__
(どういうわけか)でさえあなたが望むものをあなたに与えることができることを示唆しているように、しかし、__new__
は実際のオブジェクトを返すことを望んでいるので、あなたの目的のために意味的に良い解決策になりますそれの文字列表現だけではありません。__str __
と__repr__
への洞察については、この回答を読んでください。 https://stackoverflow.com/a/19331543/4985585。テスト:
あなたが記述しているのは、クラスではなく関数である。