LoginSignup
5
0

More than 5 years have passed since last update.

a == 1 and a == 2 and a == 3をTrueにする

Last updated at Posted at 2018-01-22

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.afuga.が取れなかったので断念しました。

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
5
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0