关于python:重写继承的方法而不更改名称

Overriding inherited method without name mangling

本问题已经有最佳答案,请猛点这里访问。

注:这里也有类似的问题,但我不认为这是一个完全相同的规格。

下面,我有两个类,一个继承自另一个。请注意,这些只是说明性质。

_Pandas.array()中,我只想在从_Numpy.array()返回的numpy数组周围包装一个pandas数据帧。我知道我当前的代码有什么问题(_Pandas.array()被重新定义,试图调用自己,并经历无限递归),但不知道如何在父类上不使用名称管理或准私有方法来修复它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd

class _Numpy(object):
    def __init__(self, x):
        self.x = x
    def array(self):
        return np.array(self.x)

class _Pandas(_Numpy):
    def __init__(self, x):
        super(_Pandas, self).__init__(x)
    def array(self):
        return pd.DataFrame(self.array())

a = [[1, 2], [3, 4]]
_Pandas(a).array()    # Intended result - pd.DataFrame(np.array(a))
                      # Infinite recursion as method shuffles back & forth

我知道我可以做一些像

1
2
3
4
5
6
7
8
9
10
11
class _Numpy(object):
    def __init__(self, x):
        self.x = x
    def _array(self):            # Changed to leading underscore
        return np.array(self.x)

class _Pandas(_Numpy):
    def __init__(self, x):
        super().__init__(x)    
    def array(self):
        return pd.DataFrame(self._array())

但这似乎非常不理想。实际上,我经常使用_Numpy,它不仅仅是一个通用的父类,我不希望在它的所有方法前面加上一个下划线。我还能怎么做?


嗯…只想知道为什么在熊猫班你不直接打电话给超级?

1
2
3
4
5
class _Pandas(_Numpy):
    def __init__(self, x):
        super(_Pandas,self).__init__(x)
    def array(self):
        return pd.DataFrame(super(_Pandas,self).array())

我试过了,结果如下,不知道这是你想要的还是我错过了什么

1
2
3
4
5
a = [[1, 2], [3, 4]]
_Pandas(a).array()
  0  1
0  1  2
1  3  4