Python 重写继承的方法而不损坏名称
注:类似的问题,但我不相信这是一个完全重复给定的规格 下面,我有两个类,一个继承自另一个。请注意,这些只是说明性的 在Python 重写继承的方法而不损坏名称,python,python-3.x,inheritance,overriding,Python,Python 3.x,Inheritance,Overriding,注:类似的问题,但我不相信这是一个完全重复给定的规格 下面,我有两个类,一个继承自另一个。请注意,这些只是说明性的 在\u Pandas.array()中,我只想在从\u NumPy.array()返回的NumPy数组周围包装一个Pandas数据框。我知道我当前的代码有什么问题(\u.array()被重新定义,尝试调用自身,并经历无限递归),但不知道如何在不损坏父类的名称或准私有方法的情况下修复它 import numpy as np import pandas as pd class _Nu
\u Pandas.array()
中,我只想在从\u NumPy.array()
返回的NumPy数组周围包装一个Pandas数据框。我知道我当前的代码有什么问题(\u.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())
但这似乎并不理想。实际上,我经常使用
\u Numpy
,它不仅仅是一个泛型父类,而且我不希望在它的所有方法前面加一个下划线。我还能怎么做呢?嗯。。。只是想知道为什么在熊猫课上你不直接打超级电话
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
嗯。。。只是想知道为什么在熊猫课上你不直接打超级电话
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
因此,您的
.array
方法返回np.ndarray
或pd.DataFrame
?这将打破Liskov替换原则,no?@juanpa.arrivillaga\u Numpy.array()
返回np.ndarray
,\u Pandas.array()
返回pd.DataFrame
(或者至少我希望如此)对,本质上,这意味着对于给定类型的任何属性,对于任何子类型都应该是真的。在这种情况下,违反了array
返回ndarray
的属性。通常,您希望方法返回相同的类型,或者至少,返回类型应该是协变的。@juanpa.arrivillaga请参见下面的答案,我感兴趣的主要是一种方法,它不需要每个方法的私有和公共版本。但这实际上似乎是一种常用的路由。因此,您的.array
方法返回np.ndarray
或pd.DataFrame
?这将打破Liskov替换原则,no?@juanpa.arrivillaga\u Numpy.array()
返回np.ndarray
,\u Pandas.array()
返回pd.DataFrame
(或者至少我希望如此)对,本质上,这意味着对于给定类型的任何属性,对于任何子类型都应该是真的。在这种情况下,违反了array
返回ndarray
的属性。通常,您希望方法返回相同的类型,或者至少,返回类型应该是协变的。@juanpa.arrivillaga请参见下面的答案,我感兴趣的主要是一种方法,它不需要每个方法的私有和公共版本。但这实际上似乎是一种常用的方法,把它想象成调用一个普通方法。很多时候,您可能希望显式调用超级方法,而不在子方法中执行任何操作。请将其视为调用普通方法。很多时候,您可能希望显式调用超级方法,而不在子方法中执行任何操作。