<p>我要提到一种重写所有方法的方法,而不必手动编写每个方法,但这只是因为我们都在这里<a href="https://mail.python.org/pipermail/tutor/2003-October/025932.html" rel="nofollow noreferrer">consenting adults</a>。我不建议这样做,如果你只是覆盖每一个操作就更清楚了。也就是说,您可以编写一个类包装器来检查基类的所有方法,并将输出转换为复杂类型的点。你知道吗</p>
<pre><code>import math
import inspect
def convert_to_base(cls):
def decorate_func(name, method, base_cls):
def method_wrapper(*args, **kwargs):
obj = method(*args, **kwargs)
return cls.convert(obj, base_cls) if isinstance(obj, base_cls) else obj
return method_wrapper if name not in ('__init__', '__new__') else method
for base_cls in cls.__bases__:
for name, method in inspect.getmembers(base_cls, inspect.isroutine): # Might want to change this filter
setattr(cls, name, decorate_func(name, method, base_cls))
return cls
@convert_to_base
class Point2d(complex):
@classmethod
def convert(cls, obj, base_cls):
# Use base_cls if you need to know which base class to convert.
return cls(obj.real, obj.imag)
def distanceTo(self, otherPoint):
return math.sqrt((self.real - otherPoint.real)**2 + (self.imag - otherPoint.imag)**2)
def x(self):
return self.real
def y(self):
return self.imag
p1 = Point2d(3, 3)
p2 = Point2d(6, 7)
p3 = p1 + p2
p4 = p3.distanceTo(p1)
print(p4)
# 9.219544457292887
</code></pre>
<p>这里发生的事情是,它只检查基类的所有方法,如果它返回的是基类的类型,则将其转换为子类,如子类中的特殊classmethod所定义的那样。你知道吗</p>