Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在对象之间链接公共类属性的方法?(不是继承)_Python_Oop_Dictionary_Attributes - Fatal编程技术网

Python 在对象之间链接公共类属性的方法?(不是继承)

Python 在对象之间链接公共类属性的方法?(不是继承),python,oop,dictionary,attributes,Python,Oop,Dictionary,Attributes,我有许多同一类的对象,每个对象包含不同的数据 但是,它们有许多属性应该是“公共的”——即在所有对象中设置为相同的值。(可以是数值、对另一个对象的引用等) 有哪些不同的实施方法? 我想到了两种方法: 包含所有对象和公共属性作为单独的键/值对的字典。这里的问题是对象是动态创建的(从文件中读取的对象数量可变),因此创建键可能是个问题 “集合”类,其中公共属性在此集合类中定义,对象组作为列表传入 我忍不住觉得可能有其他选择,或者“更好”的方法(我知道这是主观的,但我想知道所有的可能性…) 编辑: 这是我

我有许多同一类的对象,每个对象包含不同的数据

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

有哪些不同的实施方法? 我想到了两种方法:

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

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

我忍不住觉得可能有其他选择,或者“更好”的方法(我知道这是主观的,但我想知道所有的可能性…)

编辑:

这是我的具体例子

我有很多对象,每个对象定义一条河流的支流(从现在起称为
支流
),因此它们都有不同的x、y点属性

它们都应该“链接”到另一个对象,在这种情况下是一个描述域上高程的对象(从现在起称为
DEM

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

通过这种方式,我可以在使用分支的所有计算中安全地使用
DEM
。但是,这并不理想。我希望每个
分支
对象都有一个返回每个点高程的方法。为此,
DEM
需要传递到
分支
方法中(这意味着我无法将该方法定义为属性,我希望这样做)或者每个
分支
对象中都需要有一个指向
DEM
的属性。第二种方法存在允许在每个
分支
对象中引用
DEM
的单独实例的风险,这是我不允许的。让每个
分支
对象都被引用似乎有点愚蠢对同一事物使用单独的引用(最好使用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

你的案例有点太抽象了。你能给出一个更具体的例子来说明你想完成什么吗?太好了!谢谢。假设你想更改所有实例之间的class属性-这只是一个指向其他对象的案例,还是你需要定义一个方法来处理这个问题?例如,我创建了一对对象,然后
myclassattr
为0。现在我想将这两个对象的值都更改为1。您应该注意,在我的示例中,我已经更改了所有实例的class属性。如果您已经有
a
b
,并且希望重置
MyClass.myclassattr
,则可以在实例方法、类方法内或外部通过访问来执行此操作ode>MyClass.myclassattr(类内方法除外,该方法将是
cls.myclassattr
)。我刚刚遇到一个新问题。假设我想有两组这个对象,第一组需要
myclassattr
=0,第二组需要
myclassattr
=1。将第二组的
myclassattr
更改为1将改变第一组…有办法吗?没有,类属性的全部要点是y由所有实例共享。阅读了您编辑的问题后,我认为您需要定义一个集合对象。若要避免对多个dem的担忧,请在添加到集合时:
def add_branch(branch):branch.dem=self.dem;self.branchs.append(branch)
这为每个分支提供了对集合的dem.Hmm的引用。上面的问题是,如果我想将引用更改为
dem
,我需要一个遍历所有分支的函数。如果可能,我宁愿避免这种开销。。。