Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写继承的方法而不损坏名称_Python_Python 3.x_Inheritance_Overriding - Fatal编程技术网

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请参见下面的答案,我感兴趣的主要是一种方法,它不需要每个方法的私有和公共版本。但这实际上似乎是一种常用的方法,把它想象成调用一个普通方法。很多时候,您可能希望显式调用超级方法,而不在子方法中执行任何操作。请将其视为调用普通方法。很多时候,您可能希望显式调用超级方法,而不在子方法中执行任何操作。