在使用基类的子类中获取父属性

时间:2015-06-19 13:33:04

标签: python

我正在创建一个模块,我需要定义一组将在同一模块中使用的对象。

我的最终目标是让这样的事情发挥作用;

m = Mod()
obj1 = m.T1('text')
obj2 = m.T2(23)
m.togheter(obj1, obj2)

我遇到的问题是我需要跟踪子类中的ID。 我已经走到了这一步,这给了AttributeError: 'super' object has no attribute '_cid'来自return super(Mod.ModObj, self)._cid

class Mod(object):
    current_cid = 0

    @property
    def _cid(self):
        c = self.current_cid
        self.current_cid += 1
        return c

    def togheter(self, obj1, obj2):
        # Do something with obj1.text and obj2.number here...
        return True

    class ModObj(object):
        @property
        def _cid(self):
            return super(Mod.ModObj, self)._cid

    class T1(ModObj):
        def __init__(self, text):
            self.text = text
            print self._cid

    class T2(ModObj):
        def __init__(self, number):
            self.number = number
            print self._cid

m = Mod()
m.T1('text')
m.T2(23)
print m.current_cid  # Should return 2

这里有什么问题?我尝试了其他几个"试验和错误"方式,但我开始认为我这样做是完全错误的方式......

2 个答案:

答案 0 :(得分:0)

ModObj不会从Mod继承;它只是一个继承自object的嵌套类,而object确实没有名为_cid的属性(或任何属性)。

答案 1 :(得分:0)

您的班级ModObj 不是 Mod的子类,但是成员。您可能想说class ModObj(Mod)

另请注意,只要您不在子类中覆盖_cid,就根本不需要使用super,因为超类成员会自动存在于子类中(这就是类继承)。

最后 - 这真的是你想要的吗?在我看来,您希望每个Mod实例都具有唯一的ID,并且每个ModObj实例都要继承特定Mod实例的ID。类继承将这样做。您可能正在寻找亲子关系。