3

我正在阅读 Dietel 的 C++ 编程书籍。在本书中,他们提到程序员应该如何只发布代码的接口部分而不是实现。

所以把它带到python:

我有 2 个文件:1)实现文件 = accountClass.py 和 2)接口文件 = useAccountClass.py

我已经编译了实现文件并获得了.pyc文件。所以当我将我的代码提供给其他人时,我会提供给他 .pyc 文件和接口文件,对吗?

另外,如果我只向其他人提供 .pyc 文件,我可以期望他自己编写接口吗?我会说不。但是我有一个挥之不去的疑问:

numpy 和 scipy 的创建者没有与我们的最终用户共享实现。而且我认为他们也不共享任何接口。但是我们仍然可以在 numpy 和 scipy 中搜索不同的类及其方法。所以,使用这个 numpy 和 scipy 的例子,我想我想问的是:

如果我只向他/她提供已编译的实现文件(在本例中为 accountClass.pyc),其他人是否可以为我的代码创建接口?该人如何知道我在实现中定义了哪些类和方法?我的意思是,他们会使用

if __name__ = "__main__" : 
    blah blah 

还是有其他方法??

4

3 回答 3

4

完全错了。或者,也许这是一本可怕的书,作者犯了严重的错误。使用其他代码的代码确实应该,除非有重要的反驳,遵守接口而不关心实现的细节。然而,即使在静态编译为机器代码(例如 C++)的世界中,这并不意味着您应该锁定实现的源代码。

是否有人可以访问实现,以及他们是否在编写特定代码时利用这些知识,是完全不同的问题。哎呀,在处理其他代码(例如其他模块)时,即使实现的作者也可以/应该仍然对接口进行编程。同样,即使您将实现锁定在远离某人的地方,他们也很可能依赖不属于接口一部分的实现怪癖。如果静态编译机器代码的世界中的任何人只提供头文件和目标文件,而不提供源代码,那是因为这些项目是封闭源代码,而不是鼓励客户之间的良好编程实践。

在 Python 中,您的问题毫无意义——没有“接口”和“实现”文件,只有运行并定义函数、类和其他值的代码。没有您要提供的接口文件之类的东西。您提供了一个实现和(希望)文档,其中详细说明了接口和可能的实现细节。并且一旦导入一个模块,类对象、函数对象和其他对象就会包含大量信息(在许多情况下,包括生成大部分文档的文本)。对于像 numpy 这样的扩展模块也是如此。请注意,它们的实现可访问,它只是没有包含在所有发行版中,因为它用处不大。使用 Python 代码,您实际上必须分发源代码,因为其他任何内容都是特定于平台的。

附带说明一下,.pyc 文件是相当高级的,并且在反汇编时很容易理解(这就像导入模块并在dis内部的任何函数上运行 stdlib 模块一样简单)。我认为这是一个次要的技术问题,因为它已经是一个错误的问题。

于 2012-07-05T19:22:02.337 回答
0

Deitel 对 C++ 程序员的建议不适用于 Python,原因有很多:

  1. Python 不会编译成机器码,所以无论你以何种形式提供程序,别人阅读代码都相对容易。

  2. Python 没有 .h 和 .c 文件,您只能提供 .py 或 .pyc 文件。

  3. 无论如何,将代码视为秘密有点愚蠢。您的代码中有哪些内容需要对其他人隐藏?

Numpy 和 Scipy 主要在 C 中实现,这就是为什么您没有源代码,为了您自己的方便。喜欢的可以获取源码。该代码的“接口”是您可以导入然后调用的模块。

于 2012-07-05T19:19:35.813 回答
0

您不应该将“用户界面”与“类界面”混淆。如果您有一个 useAccountClass 文件,如果我理解正确的话,该文件可能会使用 accountClass 文件中定义的类和方法执行一些任务。

如果您将文件发送给其他人,他们不应该“猜测”您编译的类做了什么。这就是 DOCUMENTATION 的用途:描述模块中包含的函数(编译或未编译)、它们采用哪些参数、返回哪些值、期望它们做什么、它们执行的任务的“意义”。

作为一个抽象示例,假设您有一个图像处理类。如果该类具有 function findCircles(image),则文档应说明它需要一个可能包含圆的图像,并返回图像中包含的圆心坐标的列表或数组。如何检测圆圈并不重要,您无需知道即可使用该功能。现在如果函数被调用findCircles(image, gaussian_threshold=10),调用者必须知道函数使用了一些“gaussian_threshold”参数,也就是说,调用者需要知道函数的内脏,而在 OOP 中这是不好的。如果您决定将来使用另一种算法,则必须重写使用该函数的每个代码,因为gaussian_threshold最有可能不再有意义。

因此,在 OOP 中,接口是用于与对象通信的抽象,它只需要知道规范参数或输入,以便以问题的语言执行任务,而不是实现的语言(可以随时更改) )。

从这个意义上说,文档是向用户(在这种情况下是另一个开发人员)保证,如果向其提供合理的输入,该功能将按预期执行。

现在最终用户,一个想要使用您的程序的非技术人员,将需要整个工作程序(控件和视图),而不仅仅是类定义(模型)。

希望这会有所帮助,我必须推荐书籍“Code Complete 2nd ed”。和“实用程序员 - 从新手到大师”作为关于广泛主题的非常有启发性的读物。

于 2012-07-05T19:36:30.100 回答