【问题标题】:is there a good design pattern for this classes relation in Python?Python中的这种类关系有一个好的设计模式吗?
【发布时间】:2021-06-23 05:48:24
【问题描述】:

假设我有一个类 A,类 B 可以将类 A 作为其成员并使用类 A 的功能来完成这项工作,就像这样

 class B:
    def __init__(self, A):
        self.A = A

    def do_something(self):
        # some other jobs ....
        self.A.do_the_job()

这是一个简单的设计。但是,在我的例子中,类A也可以在B之外访问和修改,那么这个设计有点奇怪,因为虽然A是B的成员类,但实际上A可能会在B之外改变它的状态。所以我改变了就这样设计

 class B:
    def __init__(self):
        pass

    def do_something(self, A):
        # some other jobs ....
        A.do_the_job()

绝对没问题,唯一丑陋的是,现在每次我调用B.do_something时,我都需要传递A类作为它的参数。实际上,B 类还有其他几个也将使用 A 类的函数。

不知道有没有更好的设计模式来处理这种情况?

【问题讨论】:

  • 在您的第二个示例中,在调用B.do_something(A) 之前是否仍不能修改A?如果do_the_job()A 的记录功能,那么您应该可以依靠它。如果你不能,你可以相信什么?
  • A 的实例可以在课堂外更改,您对此有何疑问?如果您想避免将aA 的实例)作为参数传递,请使用上层设计并在函数的文档字符串中清楚地记录此行为。
  • 你的第一个设计一点也不奇怪。考虑file = open('test'); reader = csv.reader(file) 相同的关系。在 Python 中,这总是可能的。
  • 如果你不想self.A被修改出类,不要把A作为参数。在__init__ 方法中创建A 实例。
  • 更改B 之外的类也将更改存储在B 中的类,因为这两个操作都将在A 的同一个实例上工作。但您很可能已经意识到这一点。如果您不希望这种行为,您可以在B__init__ 中生成A 的实例,以便它是B 独有的。

标签: python class design-patterns


【解决方案1】:

很简单:

class A:
    def do(self):
        print(“Hello from A”)
class B:
    def run(self):
        A().do()
        print(“Now in B”)

所以是的,您可以通过这种方式访问​​另一个类。请记住,如果您的类位于不同的文件中,则必须使用如下行:

from mymodule import A

它也会起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2012-02-10
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多