在 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 other question,我想我可以使用 Mutable Default Argument 屬性為給定引數提供共享值,但同樣,我并不總是希望共享引數。
簡而言之,是否有可能有兩個物件,每個物件都是兩個不同類的實體,有一個共享引數?
uj5u.com熱心網友回復:
您可以有一個父類來保存資料:
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]
uj5u.com熱心網友回復:
您可以讓B實體參考A實體并使用屬性來參考grid屬性:
class A():
def __init__(self):
self.attrA = "attrA"
self.grid = None
def init_grid(self, x):
self.grid = x
class B():
def __init__(self, a):
self.attrB = "attrB"
self.a = a
@property
def grid(self):
return self.a.grid
@grid.setter
def grid(self, value):
self.a.grid = value
a = A()
a.init_grid([1,2,3])
b = B(a)
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]
按要求輸出
uj5u.com熱心網友回復:
您可以使用 aclass variable和 using.grid作為屬性,A并B僅從屬性繼承grid:
class grid:
_grid = None
@property
def grid(self):
return grid._grid
@grid.setter
def grid(self, value):
grid._grid = value
class A(grid):
def __init__(self):
self.attrA = "attrA"
class B(grid):
def __init__(self):
self.attrB = "attrB"
a = A()
a.grid = [1, 2, 3]
b = B()
print("a.grid, b.grid = ", a.grid, b.grid)
a.grid = [4, 5, 6]
print("a.grid, b.grid = ", a.grid, b.grid)
b.grid = [7, 8, 9]
print("a.grid, b.grid = ", 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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506821.html
