代码之家  ›  专栏  ›  技术社区  ›  frazman

用python设计类的最佳方法

  •  10
  • frazman  · 技术社区  · 13 年前

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

    大多数时候,我使用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)
    

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

       class FooBar:
             def __init__(self,foo):
               self._foo = foo
    
    
           def execute(self,bar):
                return something(self._foo, bar)
    

    你能建议一下哪一个坏,哪一个更坏吗?

    或任何其他方式。

    这只是一个玩具的例子(当然)。我的意思是,如果有一个函数,就没有必要在这里有一个类。。但假设在__execute中,something()调用了一整套其他方法?? 谢谢

    2 回复  |  直到 13 年前
        1
  •  9
  •   Ignacio Vazquez-Abrams    13 年前

    如果每个 FooBar 负责 bar 那么第一个是正确的。如果 酒吧 仅用于 execute() 但不是 FooBar餐厅 的问题,否则,第二个问题是正确的。

        2
  •  5
  •   Ben Burns    13 年前

    在一个短语中,你想在这里担心的正式术语是 关注点分离

    针对您的具体示例,您选择的两个示例中的哪一个取决于 FooBar bar 如果 酒吧 与处于同一问题域 FooBar餐厅 或者如果它对 FooBar餐厅 存储对的引用 酒吧 ,那么第二个例子是正确的。例如,如果 FooBar餐厅 有多个方法接受 酒吧 如果你总是传递相同的 酒吧 每个特定的 FooBar餐厅 实例的 酒吧 -相关的方法,那么前面的例子是正确的。否则,后者更为正确。

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

    虽然这对您发布的示例没有用处,但有助于在更大范围内实现这一点的一个简单模式是控制反转(IoC,有时称为依赖注入)。在IoC下,类的编写方式是,它们不直接知道自己的依赖项,只知道依赖项实现的接口(Python中的协议)。然后在运行时,通常在应用程序初始化期间,主要类的实例由工厂创建,并为它们分配对其实际依赖项的引用。看见 this article (与 this example )以解释如何在Python中实现这一点。

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

    推荐文章