-
慕尼黑的夜晚无繁华
这可以使用描述符来完成。以下类使用在类体内实例化该类时具有特殊效果的特殊方法。class SuperCaller: def __set_name__(self, owner, name): """Called when the class is defined. owner is the class that's being defined. name is the name of the method that's being defined. """ method = getattr(super(owner, owner), name) def call(self, other): # Note that this self shadows the __set_name__ self. They are two # different things. return type(self)(method(self, other)) self._call = call def __get__(self, instance, owner): """instance is an instance of owner.""" return lambda other: self._call(instance, other)class A(int): __add__ = SuperCaller()x = A()print(type(x + 1))输出:<class '__main__.A'>
-
偶然的你
一种方法是创建一个装饰器,它可以用强制转换包装所需的数学运算:def wrap_math(c): def wrapped(orig): return lambda s, o: c(orig(s,o)) maths = ["__add__", "__sub__"] for op in maths: func = wrapped(getattr(c, op)) setattr(c, op, func)return c@wrap_mathclass Special(int) pass x = Special(10) type(x + 10)完成您要包装的功能列表,您应该一切顺利。一种方法是创建一个装饰器,它可以用强制转换包装所需的数学运算:def wrap_math(c): def wrapped(orig): return lambda s, o: c(orig(s,o)) maths = ["__add__", "__sub__"] for op in maths: func = wrapped(getattr(c, op)) setattr(c, op, func)return c@wrap_mathclass Special(int) pass x = Special(10) type(x + 10)完成您要包装的功能列表,您应该一切顺利。
-
斯蒂芬大帝
该super()函数从父类调用方法,int在这种情况下。相反,您应该在方法中初始化类__add__:class A(int): def __add__(self, number): return A(self.numerator + number)x = A(4)print(type(x + 1))