在 Python 中是否可以有两个对象,每个对象都是不同类的实例,并且始终共享特定属性的相同值?
例如,假设以下代码:
class A():
def __init__(self):
self.attrA = "attrA"
self.grid = None
def init_grid(self, x):
self.grid = x
class B():
def __init__(self):
self.attrB = "attrB"
self.grid = None
def init_grid_as_preexisting(self, pre_grid):
self.grid = pre_grid
a = A()
a.init_grid([1,2,3])
b = B()
b.init_grid_as_preexisting(a.grid)
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [1, 2, 3] [1, 2, 3]
a.grid = [4,5,6]
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [4, 5, 6] [1, 2, 3]
b.grid = [7,8,9]
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [4, 5, 6] [7, 8, 9]
这里我的目标是让 a.grid
和 b.grid
始终包含相同的值,无论一个是从另一个初始化还是哪个是从另一个初始化的修改的;所需的输出将是:
a.grid, b.grid = [1, 2, 3] [1, 2, 3]
a.grid, b.grid = [4, 5, 6] [4, 5, 6]
a.grid, b.grid = [7, 8, 9] [7, 8, 9]
在 this question建议使用包含类属性的基类,并使用静态方法来修改所需的共享属性。我宁愿不使用此解决方案,因为我不想始终在所有实例之间共享此属性,只有在严格需要时才这样做。 来自 this other question ,我想我可以使用可变默认参数属性来为给定参数提供共享值,但同样,我并不总是希望共享该参数。
简而言之,是否可以让两个对象(每个对象都是两个不同类的实例)拥有共享参数?
最佳答案
您可以有一个父类来保存数据:
class GridHolder:
def __init__(self):
self.grid = None
class A:
def __init__(self, grid_holder: GridHolder):
self.attrA = "attrA"
self.grid_holder = grid_holder
@property
def grid(self):
return self.grid_holder.grid
@grid.setter
def grid(self, value):
self.grid_holder.grid = value
class B:
def __init__(self, grid_holder: GridHolder):
self.attrB = "attrB"
self.grid_holder = grid_holder
@property
def grid(self):
return self.grid_holder.grid
@grid.setter
def grid(self, value):
self.grid_holder.grid = value
data_holder = GridHolder()
a = A(data_holder)
a.grid = [1, 2, 3]
b = B(data_holder)
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [1, 2, 3] [1, 2, 3]
a.grid = [4, 5, 6]
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [4, 5, 6] [1, 2, 3]
b.grid = [7, 8, 9]
print("a.grid, b.grid = ", a.grid, b.grid)
# OUT: a.grid, b.grid = [4, 5, 6] [7, 8, 9]
输出:
a.grid, b.grid = [1, 2, 3] [1, 2, 3]
a.grid, b.grid = [4, 5, 6] [4, 5, 6]
a.grid, b.grid = [7, 8, 9] [7, 8, 9]
关于python - 两个不同的 Python 类与同一底层对象共享属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73693515/