所以,对于试图理解类的人来说,这更像是一个哲学问题。
大多数时候,我使用类的方式实际上是一种非常糟糕的使用方式。我想到了很多函数,过了一段时间后,只需缩进代码并将其设为一个类,如果变量重复很多,则用 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)
你能建议哪一个不好,哪一个更差吗?
或建议任何其他方法来做到这一点。
这当然只是一个玩具示例。我的意思是,如果只有一个函数,则不需要在这里有一个类..但是让我们说在 __execute some() 中调用一整套其他方法?
谢谢
如果每个
FooBar
都对 bar
负责,那么第一个是正确的。如果仅需要 bar
而不是 execute()
的问题,则第二个是正确的。关注点分离。 针对您的具体示例,您选择这两个示例中的哪一个取决于
FooBar
和
FooBar
解决的问题。如果 bar
与 bar
位于同一问题域中,或者如果 FooBar
存储对 FooBar
的引用有意义,则第二个示例是正确的。例如,如果 bar
有多个接受 FooBar
的方法,并且您始终将相同的 bar
实例传递给每个特定 bar
实例的 FooBar
相关方法,则前面的示例是正确的。否则,后者更正确。理想情况下,您创建的每个类都应该准确地模拟您的程序的一个主要问题。这可能会有点棘手,因为您必须自己决定“主要关注”的粒度。查看您的依赖关系树以确定您是否正确执行此操作。从程序中取出每个单独的类并与所有其他类隔离地测试它应该相对容易。如果这非常困难,那么你就没有正确地分解你的关注点。更正式地说,良好的关注点分离是通过设计
内聚和松散耦合的类来实现的。 虽然这对于您发布的示例没有用,但有助于在更广泛的范围内实现此目的的一种简单模式是控制反转(IoC,有时称为依赖注入)。在 IoC 下,类的编写方式使得它们不直接知道它们的依赖关系,只知道它们的依赖关系实现的接口(Python 中的协议)。然后在运行时,通常在应用程序初始化期间,工厂创建主要类的实例,并为它们分配对其实际依赖项的引用。请参阅
这篇文章(以及这个示例)了解如何在 Python 中完成此操作的说明。 最后,学习
面向对象编程的四个原则