2017-10-31 21 views
0

注:同様の質問hereが、私はそれが仕様を与えられた正確な複製だとは思わない。名前のマングリングなしで継承されたメソッドをオーバーライド

以下、私は2つのクラスを持ちます。一方は、もう一方から継承しています。これらは本質的に単なる例示であることに注意してください。

_Pandas.array()では、_Numpy.array()から返されたNumPy配列の周りにpandas DataFrameをラップするだけです。私は現在のコード(_Pandas.array()が再定義され、それ自身を呼び出そうと試み、無限再帰を経験します)が間違っていることを認識していますが、親クラスの名前マングリングまたは準プライベートメソッドなしで修正する方法はありません。

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 

私は

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つのアンダースコアを付けることを希望します。これについてどうすればいいですか?

+0

を見逃している、あなたの '.array'方法は、どちらか' NP返します。かどうかを知りませんndarray'または 'pd.DataFrame'?これはリスコフ置換原理を破るだろうか? –

+0

@ juanpa.arrivillaga '_Numpy.array()'は 'np.ndarray'を返します、' _Pandas.array() 'は' pd.DataFrame'を返します(または、少なくとも私はそれにしたいと思っています) –

+0

所与のタイプに当てはまる任意の特性について、任意のサブタイプに当てはまるべきであることを意味する。この場合、 'array'が' ndarray'を返すプロパティは違反されています。一般に、メソッドが同じ型を返すようにするか、少なくとも戻り型は共変でなければなりません。 –

答えて

2

Uhm ... _Pandasクラスでスーパーを直接呼び出さない理由をチェックしたいですか?

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

私はそれを試してみましたが、以下の結果を得た、それはあなたが望んだか、私はそう何

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

通常の方法を呼び出すように考えてください。多くの場合、子メソッドで何もせずに、スーパーメソッドを明示的に呼び出すことができます。 –

関連する問題