用python设计类的最佳方法
所以,对于试图理解课堂的人来说,这更像是一个哲学问题 大多数时候,我如何使用类实际上是一种非常糟糕的使用方式。我想到了很多函数,一段时间后,只要缩进代码,使其成为一个类,如果一个变量多次重复,就用self.variable替换一些东西。(我知道这是个坏习惯) 但是无论如何。。。我想问的是:用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
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上;)@皮耶雷格姆:我刚读到关于这个电话的消息。谢谢你的建议:)