簡體   English   中英

Python:迭代更改超類方法

[英]Python: Iteratively change superclass methods

我想創建一個與list相同的 class Packet ,除了它可以與int對象進行比較。 int進行比較應返回與與僅包含該intPacket進行比較相同的結果。 下面的定義做我想要的。

class Packet(list):
    def __init__(self, iterable=()):
        super().__init__()
        for x in iterable:
            if isinstance(x, list):
                self.append(type(self)(x))
            else:
                self.append(x)

    def __lt__(self, x):
        if isinstance(x, int):
            return self.__lt__(type(self)([x]))
        return super().__lt__(x)

    def __le__(self, x):
        if isinstance(x, int):
            return self.__le__(type(self)([x]))
        return super().__le__(x)

    def __eq__(self, x):
        if isinstance(x, int):
            return self.__eq__(type(self)([x]))
        return super().__eq__(x)

    def __ne__(self, x):
        if isinstance(x, int):
            return self.__ne__(type(self)([x]))
        return super().__ne__(x)

    def __ge__(self, x):
        if isinstance(x, int):
            return self.__ge__(type(self)([x]))
        return super().__ge__(x)

    def __gt__(self, x):
        if isinstance(x, int):
            return self.__gt__(type(self)([x]))
        return super().__gt__(x)

a = Packet([2, 3, 5])
b = Packet([[2], 3, [[5]]])
c = Packet([2, [3, 4]])
d = 2

assert a == b
assert a < c
assert a > d
assert b < c
assert b > d
assert c > d

但是,這是相當重復的; 我寫了六次基本相同的代碼。 必須有一種方法可以循環執行此操作,或者至少使用裝飾器,對嗎? 如何在不重復自己的情況下創建相同的 class?

我希望它有效;

def proof(self):
    return "this is __str__ overriding"


def same_func(self, x):
    if isinstance(x, int):
        return self.__gt__(type(self)([x]))
    return super().__gt__(x)


class SuperPacket(list):
    def __init__(self):
        overrides_functions = ["__lt__", " __le__", "__eq__", "__ne__", "__ge__", "__gt__"]
        for func in overrides_functions:
            setattr(SuperPacket, func, same_func)
        setattr(SuperPacket, '__str__', proof)
        super().__init__()


hello = SuperPacket()
print(hello)

根據評論,我向您提供另一種方法;

def same_func(self, x):
    if isinstance(x, int):
        return self.__gt__(type(self)([x]))
    return super().__gt__(x)


class SuperPacket(list):
    def __init__(self, iterable=()):
        self.__gt__ = same_func
        self.__lt__ = same_func
        self.__le__ = same_func
        self.__ne__ = same_func
        self.__ge__ = same_func
        self.__gt__ = same_func
        self.__eq__ = same_func
        super().__init__()
        for x in iterable:
            if isinstance(x, list):
                self.append(type(self)(x))
            else:
                self.append(x)


hello = SuperPacket([2])
print(hello == [2])
# True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM