【问题标题】:Methods to link common class attributes between objects? (not inheritance)链接对象之间公共类属性的方法? (不是继承)
【发布时间】:2014-01-28 09:53:49
【问题描述】:

我有许多相同类的对象,每个对象都保存不同的数据。

但是,它们有许多应该是“通用”的属性 - 即在所有对象中设置为相同的值。 (这可能是一个数值、对另一个对象的引用等)

有哪些不同的实现方法? 我想到的几种方法:

包含所有对象和公共属性作为单独的键/值对的字典。这里的问题是对象是动态创建的(从文件中读取的对象数量可变)所以创建键可能是一个问题

一个“集合”类,其中公共属性在此集合类中定义,对象组作为列表传入

我不禁觉得可能有替代品,或者“更好”的方法(我知道这是主观的,但我想知道所有的可能性......)

编辑:

这是我的具体例子。

我有许多对象,每个对象都定义了一条河流的分支(从现在开始称为Branches。所以,它们都有不同的 x,y 点属性。

它们都应该“链接”到另一个对象,在本例中是一个描述域上海拔的对象(从现在开始称为DEM

一种方法可以是一个“收集器”类(称为Network),它将所有Branches 对象组合在一起,并具有一个对DEM 的引用的属性。

这样,我可以在所有使用Branches 的计算中安全地使用DEM。然而,这并不理想。我希望每个Branches 对象都有一个返回每个点的高程的方法。为此,DEM 需要传递给Branches 方法(这意味着我不能将该方法定义为我想做的属性)或者每个Branches 对象中都需要有一个属性指向DEM。第二种方法存在允许在每个Branches 对象中引用DEM 的单独实例的风险,我不会不允许这样做。让每个 Branches 对象持有对同一事物的单独引用似乎也有点愚蠢(最好使用 1 个全局引用 - 这样我可以更改它而无需遍历每个 Branches 对象)。

我发现这种事情到处都是——我有很多同一个对象的实例,但我想保持它们之间的一些共同属性——所以更一般的答案是首选..

【问题讨论】:

  • 你的案例有点太抽象了。你能举一个更具体的例子来说明你想要完成的事情吗?

标签: python oop dictionary attributes


【解决方案1】:

如果你想拥有一个类的所有实例共享和访问的属性,请使用类属性:

class MyClass(object):

    myclassattr = 0 # class attribute

    def __init__(self, attr):
        self.myinstattr = attr # instance attribute
        if MyClass.myclassattr == 0:
            print("First!")
        MyClass.myclassattr += 1    

例如:

>>> a = MyClass()
First!
>>> b = MyClass()
>>> MyClass.myclassattr
2

【讨论】:

  • 太棒了!谢谢。假设您想更改所有实例之间的类属性 - 是否只是将其指向其他内容的情况,还是您需要定义一个方法来处理这个?例如。我创建了一对对象,myclassattr 为 0。现在我想将两个对象都改为 1
  • 您应该注意,在我的示例中,我已经更改了所有实例的类属性。如果您已经拥有ab 并且想要重置MyClass.myclassattr,您可以在实例方法、类方法中或在外部通过访问MyClass.myclassattr 来执行此操作(除了在类方法中,它会在哪里cls.myclassattr)。
  • 我刚遇到一个新问题。假设我想要 2 组这个对象,第一组需要 myclassattr = 0,第二组需要 myclassattr = 1。将第二组的 myclassattr 更改为 1 将改变第一组...是有办法吗?
  • 不,类属性的全部意义在于它们由 所有 实例共享。阅读了您编辑的问题后,我认为您需要定义您所谓的集合对象。为了解决对多个 DEM 的担忧,当您添加到集合时:def add_branch(branch): branch.dem = self.dem; self.branches.append(branch) 这将为每个分支提供对集合 dem 的引用。
  • 嗯。上面的问题是,如果我想更改对DEM 的引用,我将需要一个遍历所有分支的函数。如果可能的话,我宁愿避免这种开销......
猜你喜欢
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多