继承(共享)公共超类属性的子类对象的集合

时间:2018-01-24 19:33:46

标签: python class collections attributes datamodel

我试图让子类从其超级继承属性,但同时,超级存储子类的集合对象。这是我的尝试,但我觉得这不是一种有效的方法,而且可能还有更好的方法来实现它。

setTimeout

1 个答案:

答案 0 :(得分:0)

关于类的设计,有很多未说明的内容可能会对实现产生影响。

以下是与您的实现 类似 的内容,它是一个Python 3实现,并使用更少的代码行,这在这方面更有效。子类容器是父类的类属性;子类实例在创建时添加到容器中。容器包含对对象的弱引用,以便当它们超出范围或被删除时,它们可以被垃圾收集。

import weakref

class SuperCls:
    subclass_instances = weakref.WeakKeyDictionary()
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.col = []

class SubCls(SuperCls):
    def __init__(self, a, b, c, d):
        self.c = c
        self.d = d
        super().__init__(a,b)
        super().subclass_instances[self] = str(self)
    def __str__(self):
        s = 'a:{}, b:{},c:{},d:{}'.format(self.a,self.b, self.c, self.d)
        return s


a = 1
b = 2
sub=SubCls(a,b,3,4)
sub2=SubCls(a,b,5,6)
sub3=SubCls(a,b,7,8)

这些都打印相同的东西 - 每个对象都可以访问容器。

print(' | '.join(map(str, SuperCls.subclass_instances)))
print(' | '.join(map(str, sub.subclass_instances)))
print(' | '.join(map(str, sub2.subclass_instances)))
print(' | '.join(map(str, sub3.subclass_instances)))

print(SuperCls.subclass_instances is sub.subclass_instances is sub2.subclass_instances is sub3.subclass_instances)将打印True