在python中重写子对象中父实例变量的父setter方法

在python中重写子对象中父实例变量的父setter方法,python,Python,我有一个名为singleExperimentData的父类,有几个参数,其中一个是OD: class singleExperimentData(object): def __init__(self): self.__t = np.array([]) self.__OD = None @property def OD(self): return self.__OD @OD.setter def OD(sel

我有一个名为singleExperimentData的父类,有几个参数,其中一个是OD:

class singleExperimentData(object):
    def __init__(self):
        self.__t = np.array([])
        self.__OD = None

    @property
    def OD(self):
        return self.__OD

    @OD.setter
    def OD(self, OD):
        self.__OD = OD
        self.checkTimeVectors()
我有另一个从singleExperimentData继承的父类,但我想重写setter,这样它就不会调用checkTimeVectors:

class singleExperimentDataShell(singleExperimentData):
    @singleExperimentData.OD.setter
    def OD(self, OD):
        self.__OD = OD
我想知道这是不是正确的语法?当我查看变量时,似乎有几个不同的变量:

_singleExperimentData_OD = [data as expected]
OD = None
我首先使用以下函数将OD设置为timeCourseObject():

self.avg = singleExperimentDataShell()
self.avg.OD = timeCourseObject()
self.avg.OD.dataVec = data
但我得到了以下错误:

AttributeError: 'NoneType' object has no attribute 'dataVec'

请注意,“None”是singleExperimentData中的默认数据类型,但即使我将其设置为timeCourseObject,它似乎也不起作用。我觉得我对setter和getter做了一些错误的处理,但我不确定。

正如您所发现的,双下划线的名称是“损坏的”。这可用于创建“阻止”子类访问的类私有属性。(我在引号中加上“预防”,因为预防是可以规避的。)这种行为是错误的

单下划线名称不具有此行为。单下划线纯粹是一种表示不属于类的公共API的属性的约定


您不应该使用双下划线属性名称,除非您确实希望将它们限制为仅由它们所在的类(而不是子类)访问。

正如您所发现的,双下划线名称是“损坏的”。这可用于创建“阻止”子类访问的类私有属性。(我在引号中加上“预防”,因为预防是可以规避的。)这种行为是错误的

单下划线名称不具有此行为。单下划线纯粹是一种表示不属于类的公共API的属性的约定


您不应该使用双下划线属性名称,除非您确实想将它们限制为仅由它们所在的类(而不是子类)访问。

使用双下划线名称(如
\uu OD
)有什么原因吗?这些是用于类私有变量的,因此如果基类定义了
\uuuod
,子类将(很容易)无法访问该属性。如果您将属性更改为
\u OD
(单下划线),它是否符合您的要求?我将双下划线替换为单下划线,它似乎可以工作。你能解释一下单下划线和双下划线的区别吗?当双下划线为私有时,单下划线是否受保护?是否有原因使用双下划线名称,如
\uuu OD
?这些是用于类私有变量的,因此如果基类定义了
\uuuod
,子类将(很容易)无法访问该属性。如果您将属性更改为
\u OD
(单下划线),它是否符合您的要求?我将双下划线替换为单下划线,它似乎可以工作。你能解释一下单下划线和双下划线的区别吗?单下划线是否受保护,而双下划线是否为专用?