python - 两个不同的 Python 类与同一底层对象共享属性

标签 python class oop attributes

在 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.gridb.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/

相关文章:

c++ - 自定义类的正确构造函数

Python tar生成问题

python - 在 Python 中将 RGB 像素转换为灰度。没有matplot或PIL

java - 使用 Java 类/继承时出错

c++ - 错误 C2440 : 'initializing' : cannot convert from 'classname *' to 'classname'

sql - 维护关系数据库中子类的完整性

Python 3 二进制到十六进制(带填充)

python - Freeswitch mod_python 没有名为 freeswitch 的模块

C++ 类成员和延迟初始化

c++ - 虚函数表指针在对象中的位置