Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python设计类的最佳方法_Python_Oop_Class_Coding Style - Fatal编程技术网

用python设计类的最佳方法

用python设计类的最佳方法,python,oop,class,coding-style,Python,Oop,Class,Coding Style,所以,对于试图理解课堂的人来说,这更像是一个哲学问题 大多数时候,我如何使用类实际上是一种非常糟糕的使用方式。我想到了很多函数,一段时间后,只要缩进代码,使其成为一个类,如果一个变量多次重复,就用self.variable替换一些东西。(我知道这是个坏习惯) 但是无论如何。。。我想问的是: class FooBar: def __init__(self,foo,bar): self._foo = foo self._bar = bar

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

大多数时候,我如何使用类实际上是一种非常糟糕的使用方式。我想到了很多函数,一段时间后,只要缩进代码,使其成为一个类,如果一个变量多次重复,就用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)
你能建议哪一个不好,哪一个更坏吗

或者任何其他的方法

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

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

在一个短语中,您需要担心的正式术语是关注点分离

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

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

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


最后,学习。

为什么执行
\uuuuuu而不是调用
\uuuu
?使类实例像函数一样可调用?也就是说,@PierreGM:我刚刚发现了这个电话。谢谢让我读一下:)@BenBurns:我希望这句话。。然后我看到有一个“编码风格”的标签:)我不希望在这里问很多这样的问题,但在quora上;)@皮耶雷格姆:我刚读到关于这个电话的消息。谢谢你的建议:)