我看到有些人通过创建一个类然后调用所有方法的对象来编写Python代码。如果我们不使用继承,封装等,是否有使用类的优势?这些代码在我看来不那么干净,所有这些“自我”论证,我们可以避免。这种做法是否受到其他编程语言(如Java)的影响,或者是否有任何理由说明为什么Python程序应该像这样构造?
示例代码:
class App:
# all the methods go here
a = App()
答案 0 :(得分:7)
虽然并非总是适用,但其中一个优点是可以通过继承一个类来轻松扩展程序。例如,我可以对它进行子类化并覆盖从csv文件读取读取xml文件然后根据运行时信息实例化子类或原始类的方法。从那里,程序的逻辑可以正常进行。
这当然引发了一个问题,即读取文件是否真的是类的责任,或者更恰当地属于具有用于读取不同类型数据的子类的类,并且提供了与该数据的统一接口,但是当然,另一个问题。
就个人而言,我发现最简洁的方法是将对其参数做出强有力假设的函数作为方法放在适当的类上,并将函数作为函数放置在模块中作为非常弱的假设。 / p>
答案 1 :(得分:4)
我经常为应用程序的管理器部分做同样的事情,从理论上讲,它可以简化为简单,非常顺序的函数式编程。
它(对我来说)的主要优点是它可以很好地封装你的主循环或一次性执行一次,它允许在块之间高效,干净地配置运行和持久化数据,从根本上根据需要重新配置它无需更改代码本身。更不用说将执行子类化为另一个和扩展的执行的能力。
通过这种方式扩展主体也往往容易得多,然后就是当你有一个200线的固体块扔在相当隐蔽的范围内时。
自我,在你写了足够多的Python之后,有点作为一个障碍消失了,我个人喜欢它如何立即提供我将显然想要在范围内持久存在的东西,以及我做的一次性元素之间的视觉区别想要超出范围并在特定步骤完成后立即收集。
最后但并非最不重要的是,有些人会反对任何他们得到的东西,或者无法阅读它。我是其中之一:)
答案 2 :(得分:3)
<强> 1。我知道有一个用途。
虽然这可以通过其他方式实现。它确保两个模块 - module_B和module_C使用相同的App实例,并且不实例化单独的对象。
在module_A.py
中class App:
....
a = App()
在module_B.py
中from module_A import a
在module_C.py
中from module_A import a
当然,您可以创建单独的对象,但这不是上述模块的意图。
如果您在module_D.py
中执行了以下操作,该怎么办?from module_A import App
a = App()
<强> 2。 [迂腐] 强>
您可以避免使用类并仅使用模块和函数来分解解决方案。但是在大型项目中看起来不会那么丑陋。您不想在程序中使用面向对象的范例吗?所有语言都提供了一些利用OO的方法。我们都喜欢某种东西或其他东西,有些确实让我们失望。显式优于隐式通常是Python方式。虽然这并不足以说明它的包含。
答案 3 :(得分:2)
我倾向于使用类,因为我认为我可能需要多个实例,或者我认为继承它会有用。如果我只是想找到一种方法来对影响其行为的相关功能和设置进行分组,那么,模块可以更好地工作,语法更少。有时我会在同一个模块中使用这两种方法。
此外,尽管您可以将装饰器和上下文管理器编写为类,但我个人倾向于在编写为函数时更清楚地发现它们,因此我通常会编写它们。
Python是一种多范式编程语言。使用您认为最清楚地表达您的意图的任何方法。你从不需要来使用OO。
我喜欢使用的一种方法是考虑如果其他人打算用通用的方式编写模块来解决像我这样的问题,我会想要提供给我的各种功能。基本上,我首先尝试设计模块之间的接口,并使每个接口尽可能简单易用。在这一点上,我开始明白我应该为每一点功能使用什么方法。
但我只是一个人,编程不是我的主要工作。
答案 4 :(得分:1)
如果我们不使用继承,封装等,是否有使用类的优势?
是
这种做法受到其他编程语言(如Java)的影响
没有
为什么Python程序的结构应该是这样的?
是
然而。从你的问题来看,你已经明确地决定“这些代码对我来说在所有这些'自我'论证中看起来不那么干净了。”
如果您已经确定“不太干净”,那么在解释类声明的优点方面没有太多意义。
考虑一下。
底线。
你可以在没有课堂的情况下短暂工作。直到你做出改变。然后你会后悔没有class
这个词以及所有那些“不洁”的自我论点。
你最终会添加它们。
为什么要等?