Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflowの問題が流行っているようなので自分もPython3で挑戦してみました。
__eq__
が常にTrue
を返すという方法はa == 1 and a == 2 and a == 3 がTrueになるPythonスクリプト - Qiitaですでに上がっているので、自分はStack Overflowの回答と似た感じ(ちゃんと1,2,3と比較を行う)にしてみました。
まぁ、__eq__
をいじってしまったので、結局意味のない解法ですが。
class Hoge(int):
def __init__(self,n):
self._i = 1
super().__init__()
def __eq__(self,other):
if self._i < 4:
result = self._i == other
self._i += 1
return result
else:
return super().__eq__(other)
if __name__=='__main__':
a = Hoge(10)
print(a == 1 and a == 2 and a == 3) # => True
print(a == 1 and a == 2 and a == 3) # => False
print(a) # => 10
print(a == 10) # => True
最初は以下のようにプロパティにしてイテレータで値を返すというのを考えたのですが、fuga.a
のfuga.
が取れなかったので断念しました。
class Fuga(object):
def __init__(self):
self._a = iter((1,2,3))
@property
def a(self):
return next(self._a)
if __name__=='__main__':
fuga = Fuga()
print(fuga.a == 1 and fuga.a == 2 and fuga.a == 3) # => True
__eq__
無し縛りだとpythonでは難しそうですね…
- 追記
「常にTrue
」というわけではなくなっているのに書いてから気づきました(最初は1回の比較でTrue
なら良いと勘違いしていました。)
以下あまり変わらない修正後です。相変わらず若干汚い…(^ ^;
それにこれだとint
を継承する意味がないですね苦笑
class Hoge(int):
def __init__(self,n):
self._i = 1
super().__init__()
def __eq__(self,other):
result = self._i == other
self._i += 1
# a == 1,a == 2,a == 3の順番のみTrueとなるようにした
if self._i > 3 or not result: self._i = 1
return result
if __name__=='__main__':
a = Hoge(10)
print(a == 1 and a == 2 and a == 3) # => True
print(a) # => 10
print(a == 10) # => False
print(a == 1 and a == 2 and a == 3) # => True