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
,则可以在实例方法、类方法内或外部通过访问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
,我需要一个遍历所有分支的函数。如果可能,我宁愿避免这种开销。。。