在python中覆盖Child中的父实例变量的父setter方法

时间:2015-10-11 00:52:27

标签: 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(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'

请注意"无"是singleExperimentData中的默认数据类型,但即使我已将其设置为timeCourseObject,它似乎也无法工作。我觉得自己在制定者和吸气者方面做错了,但我不确定。

1 个答案:

答案 0 :(得分:0)

正如您所发现的,双下划线名称是“受损”。这可以用于创建类 - 私有属性,子类被“阻止”访问。 (我将“阻止”放在引号中,因为可以规避预防。)此行为是documented

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

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