【问题标题】:Collection of subclass objects that inherit (share) common superclass attributes继承(共享)公共超类属性的子类对象的集合
【发布时间】:2018-07-03 23:02:03
【问题描述】:

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

class SuperCls:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.col = []
    def addSubCls(self, cCls):
        self.col.append(cCls)

class SubCls(SuperCls):
    def __init__(self, sp, c, d):
        self.c = c
        self.d = d
        SuperCls.__init__(self, sp.a, sp.b)
    def __str__(self):
        s = 'a:{}, b:{},c:{},d:{}'.format(self.a,self.b, self.c, self.d)
        return s

sup = SuperCls(1,2)

sub=SubCls(sup,3,4)
sup.addSubCls(sub)

sub2=SubCls(sup,5,6)
sup.addSubCls(sub2)
sub3=SubCls(sup,7,8)
sup.addSubCls(sub3)

print '[%s]' % '| '.join(map(str, sup.col[0:]))
# printout:  [a:1, b:2,c:3,d:4| a:1, b:2,c:5,d:6| a:1, b:2,c:7,d:8]

【问题讨论】:

  • 是什么让你觉得它效率低下?您不喜欢您的解决方案的哪些方面?
  • 最终项目旨在容纳多个嵌套集合
  • ...和..1。这些是我写过的python的第一行,只是新手关心。 2. 最终项目旨在容纳多个嵌套集合,我发现引用/调用是多余的。 3. 出于同样的原因,我最初的想法是在 sup 类中附加一个子对象的集合,并能够在子方法中使用 sup 属性作为输入。
  • 这真的不是一个论坛或教程。您应该花时间阅读How to Ask 和该页面上的其他链接。关于你的类的设计,还有很多事情没有说清楚,这可能会影响实现。如果您使用的是 Python 2,那么您应该在还在学习的时候真正切换到 Python 3.6+。

标签: python class collections attributes datamodel


【解决方案1】:

关于你的类的设计还有很多没有说清楚的地方,这可能会对实现产生影响。

这里有一些与您的实现相似的东西,它是一个 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

【讨论】:

  • Tx wwii,感谢您的反馈,我会在未来尝试更具体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多