就 OOP 而言,在 HAS-A 相关的类之间共享状态的更好方法是什么?

in terms of oop, what is better way to share state between classes which are has-a related?

提问人:k9wan 提问时间:10/18/2023 更新时间:10/18/2023 访问量:27

问:

对不起,如果我的英语不好,我的母语是韩语。

假设 class 有 class 的字段 和 ,并且 class 有 的字段
instance of ,是在创建 instance of 时创建的,是它的字段。 也是相似的。
now 有方法,它依赖于 的实例的状态。
为了实现这一点,我传递了 for initializing 的整个实例。
用 Python 编写的示例大致简化了不需要的细节:
ABCCDBCADDBAC

class D(object):
    def __init__(self, a, num):
        self.a = a
        self.num = num
    def print(self):
        print(self.a.b.cur() * self.num)

class C(object):
    def __init__(self, a):
        self.d = D(a, 3)

class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def cur(self):
        return self.x, self.y

class A(object):
    def __init__(self):
        self.c = C(self)
        self.b = B(3, 4)

但我觉得通过自我有点奇怪。 我搜索了几篇文章来寻找共享状态的方法,他们说要使类包含状态(或上下文)。但是,我怎样才能在每个类上正确跟踪这些状态? 如果我像这样制作 State 实例:

class State(object):
    def __init__(self, b=None):
        self.b = b

class D(object):
    def __init__(self, a, num):
        self.a = a
        self.num = num
    def print(self):
        print(self.a.b.cur() * self.num)

class C(object):
    def __init__(self, a):
        self.d = D(a, 3)

class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def cur(self):
        return self.x, self.y

class A(object):
    def __init__(self):
        self.c = C(self)
        self.b = B(3, 4)
        self.state = State(self.b)

那么要使得对实例的访问权,它仍然需要被传递。似乎比以前更糟。Dself.stateAself

会有更好的方法吗?(我想知道如果存在是相关的或不相关的呢?

python 对象 oop

评论


答:

0赞 quamrana 10/18/2023 #1

如果您需要访问一个 ,那么这就是应该给出的:DB

class D(object):
    def __init__(self, b, num):
        self.b = b
        self.num = num
    def print(self):
        print(self.b.cur() * self.num)

class C(object):
    def __init__(self, b):
        self.d = D(b, 3)

class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def cur(self):
        return self.x, self.y

class A(object):
    def __init__(self):
        self.b = B(3, 4)
        self.c = C(self.b)

评论

0赞 quamrana 10/18/2023
请参阅有关得墨忒耳定律的问题的答案
0赞 k9wan 10/18/2023
我认为从根本上说,它本质上与传球或传球的方法几乎相同,我通过而不是故意通过。这是实现目标的最佳方式吗?selfself.bselfself.b
0赞 k9wan 10/18/2023
看来得墨忒耳定律帮助我得到了一些东西。
0赞 quamrana 10/18/2023
是的,从功能上讲,这两种方式是相同的。单元测试无法区分它们。然而,在设计方面,这是一个很小但意义重大的改进:现在不必知道结构的那部分,使其更具可重用性。DA
0赞 k9wan 10/18/2023
那么如果需要另一个这样的实例,其中的字段是,传递一个元组而不是一个元组会更好吗?DEA(self.b, self.e)self