【问题标题】:Best way to design a class in python在 python 中设计类的最佳方法
【发布时间】:2012-09-05 16:14:35
【问题描述】:

所以,对于试图理解类的人来说,这更像是一个哲学问题。

大多数时候,我如何使用类实际上是一种非常糟糕的使用方式。我想到了很多函数,一段时间后只是缩进代码并使其成为一个类,如果一个变量重复很多,用 self.variable 替换一些东西。 (我知道这是不好的做法) 但无论如何......我要问的是:

 class FooBar:
       def __init__(self,foo,bar):
           self._foo = foo
           self._bar = bar
           self.ans = self.__execute()

       def __execute(self):
            return something(self._foo, self._bar)

现在有很多方法可以做到这一点:

   class FooBar:
         def __init__(self,foo):
           self._foo = foo


       def execute(self,bar):
            return something(self._foo, bar)

你能建议哪个不好,哪个更差吗?

或任何其他方式来做到这一点。

这只是一个玩具示例(offcourse)。我的意思是,如果有一个函数,这里就不需要有一个类.. 但是让我们说 __execute something() 调用一整套其他方法.. ?? 谢谢

【问题讨论】:

  • 为什么是 __execute 而不是 __call__ ?让类实例像函数一样可调用?
  • @PierreGM:我刚刚发现了电话。谢谢。让我读一下:)
  • @BenBurns:我希望这个评论..然后我看到有一个“编码风格”的标签:)我希望不要在这里问很多这样的问题,而是在 quora 上;)
  • @PierreGM:我刚读到call。谢谢你的建议:)

标签: python oop class coding-style


【解决方案1】:

如果每个FooBar 负责bar,那么第一个是正确的。如果bar 只需要execute() 而不是FooBar 的问题,则第二种是正确的。

【讨论】:

  • 您是否应该在init中声明所有输入变量,以便您可以根据它轻松查看对象和程序的接口。第二个例子对我来说看起来像是泄漏,因为想象类中有许多函数,其中一个有一个未在 init 中声明的变量,并且该函数需要该变量。它就像埋在/隐藏在程序员的视线之外
【解决方案2】:

一句话,您在这里要担心的正式术语是关注点分离

针对您的具体示例,您选择的两个示例中的哪一个取决于FooBarbar 解决的问题。如果barFooBar 在同一个问题域中,或者如果FooBar 存储对bar 的引用是有意义的,那么第二个示例是正确的。例如,如果FooBar 有多个接受bar 的方法,并且如果您始终将bar 的相同实例传递给特定FooBar 实例的bar 相关方法中的每一个,那么前面的示例是正确的.否则,后者更正确。

理想情况下,您创建的每个类都应该准确地模拟您的程序的一个主要关注点。这可能会有点棘手,因为您必须自己决定“主要关注点”的粒度。查看您的依赖关系树以确定您是否正确执行此操作。将每个单独的类从程序中拉出来并与所有其他类隔离测试应该相对容易。如果这非常困难,则说明您没有正确划分您的关注点。更正式地说,良好的关注点分离是通过设计cohesive and loosely coupled 的类来实现的。

虽然这对您发布的示例没有用处,但有助于在更广泛范围内实现此目的的一种简单模式是控制反转(IoC,有时称为依赖注入)。在 IoC 下,类的编写方式是它们不直接知道它们的依赖关系,只知道它们的依赖关系实现的接口(Python 中的协议)。然后在运行时,通常是在应用程序初始化期间,主要类的实例由工厂创建,并为它们分配对其实际依赖项的引用。请参阅 this article(和 this example)了解如何在 Python 中完成此操作。

最后,学习the four tenets of object-oriented programming

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多