注:同様の質問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つのアンダースコアを付けることを希望します。これについてどうすればいいですか?
を見逃している、あなたの '.array'方法は、どちらか' NP返します。かどうかを知りませんndarray'または 'pd.DataFrame'?これはリスコフ置換原理を破るだろうか? –
@ juanpa.arrivillaga '_Numpy.array()'は 'np.ndarray'を返します、' _Pandas.array() 'は' pd.DataFrame'を返します(または、少なくとも私はそれにしたいと思っています) –
所与のタイプに当てはまる任意の特性について、任意のサブタイプに当てはまるべきであることを意味する。この場合、 'array'が' ndarray'を返すプロパティは違反されています。一般に、メソッドが同じ型を返すようにするか、少なくとも戻り型は共変でなければなりません。 –