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