<p>如果使用<code>inspect.getsourcelines</code>检查这两个函数<code>mul</code>和<code>__mul__</code>的源代码,您会发现它们实际上有不同的实现。你知道吗</p>
<p>而且使用<code>s.mul(2).attr</code>仍然不起作用,因为它只是使用<code>__finalize__</code>来传播所有属性,而不是真正地将属性相乘。你知道吗</p>
<p>或者我误解了你的问题,你只是想传播而不是乘<code>attr</code>?你知道吗</p>
<p>如果是,您可以修改您的自定义<code>__mul__</code>函数来调用<code>__finalize__</code>。你知道吗</p>
<pre><code>from pandas import Series
class Xseries(Series):
_metadata = ['attr']
@property
def _constructor(self):
return Xseries
def __init__(self, *args, **kwargs):
self.attr = kwargs.pop('attr', 0)
super().__init__(*args, **kwargs)
def __mul__(self, other):
internal_result = super().__mul__(other)
return internal_result.__finalize__(self)
s = Xseries([1, 2, 3], attr=3)
</code></pre>
<p>否则,可以手动将<code>attr</code>相乘并返回。你知道吗</p>
<pre><code>from pandas import Series
class Xseries(Series):
_metadata = ['attr']
@property
def _constructor(self):
return Xseries
def __init__(self, *args, **kwargs):
self.attr = kwargs.pop('attr', 0)
super().__init__(*args, **kwargs)
def __mul__(self, other):
internal_result = super().__mul__(other)
if hasattr(other, "attr"):
internal_result.attr = self.attr * other.attr
else:
internal_result.attr = self.attr * other
return internal_result
s = Xseries([1, 2, 3], attr=3)
</code></pre>