[英]Python: Iteratively change superclass methods
我想創建一個與list
相同的 class Packet
,除了它可以與int
對象進行比較。 與int
進行比較應返回與與僅包含該int
的Packet
進行比較相同的結果。 下面的定義做我想要的。
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.