- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
此问题基于 this one asked earlier还有this one ,但解决了一个更微妙的问题,具体来说,什么才算是“内部类”?
这是我的情况。我正在构建一个用于操作 MS Office 文件的 Python 库,其中许多类并不打算在外部构建,但它们的许多方法都是 API 的重要部分。例如:
class _Slide(object):
def add_shape(self):
...
_Slide
不能在外部构造,作为库的最终用户,您可以通过调用 Presentation.add_slide()
获得一张新幻灯片。但是,一旦有了幻灯片,您肯定希望能够调用 add_shape()
。所以该方法是 API 的一部分,但构造函数不是。这种情况在库中出现了数十次,因为只有 Presentation 类具有外部/API 构造函数。
PEP8 在这一点上模棱两可,提到了“内部类”,但没有详细说明什么才算是内部类。在这种情况下,我想可以说这个类是“部分内部的”。
问题是我只有两个符号来区分至少三种不同的情况:
我注意到,从通信的角度来看,外部 API(图书馆最终用户受众)和内部 API(开发人员受众)的明确表达之间存在冲突。对于最终用户,调用 _Slide()
是禁止的/自担风险。然而,它是内部 API 的一个快乐成员,并且与 _random_helper_method()
不同,后者只能从 _Slide()
中调用。
你对这个问题有什么观点可以帮助我吗?惯例是否规定我在类名上使用我的“单前导下划线”弹药以争取最终用户 API 的清晰度,或者我是否可以保留它以与我自己和其他开发人员沟通类 API 何时真正私有(private)且不被使用,例如,由它所在的模块外部的对象使用,因为它是一个可能更改的实现细节?
更新:经过几年的进一步思考,我已经习惯了在命名不打算作为类访问的类时使用前导下划线的约定作为一个类 在他们的模块(文件)之外。这种访问通常是实例化该类的对象或访问类方法等。
这为模块的用户(当然通常是您自己 :) 提供了基本指示器:“如果带有前导下划线的类名出现在导入语句中,则说明您做错了。” (单元测试模块是此规则的一个异常(exception),此类导入可能经常出现在“内部”类的单元测试中。)
请注意,这是对类 的访问。访问模块外部该类(类型)的对象(可能由工厂或其他任何方式提供)是完全没问题的,而且可能是预期的。我认为这种未能区分类和由类创建的对象是导致我最初感到困惑的原因。
这个约定还有一个附带的好处,就是在执行 from module import *
语句时不包括这些类。尽管我从不在自己的代码中使用它们并建议避免使用它们,但这是一种适当的行为,因为这些类标识符不打算成为模块接口(interface)的一部分。
这是我个人经过多年试验得出的“最佳实践”,当然不是“正确”的方法。您的里程可能会有所不同。
最佳答案
我无法仅根据您问题中的描述判断,但根据您在评论中提供的其他信息,我认为您的 Slide
类实际上是公开的。
尽管实例只会通过调用 Presentation
的 add_slide()
方法间接创建,但这是正确的,因为调用者随后将空闲(以及更多可能需要)调用实例的方法以在之后对其进行操作。在我看来,一个真正的私有(private)类只能被“拥有”它的类的方法访问。
让事情成为任何其他方式既会破坏封装又会增加设计组件之间的耦合,这两者都是不可取的,为了灵 active 和可重用性应尽可能避免。
关于python - Python 类名中的前导下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18540371/
我目前有以下选择语句: SELECT CONCAT(TRUNCATE(HOUR("215:00:36")/24,0),":",HOUR("215:00:36")%24,":",MINUTE("215:
我正在尝试将字符串编码为 base36。 static char *decode(unsigned long long value) { char base36[37] = "01234567
如果我有一个输入字符串,input 有三个或更多小数位,我希望该字符串由单独的 if-loop 处理。 我为此目的创建了以下控制台程序,如果(第一个约束)有小数点 .,则输入 if-loop字符串和(
我有一小段代码,它有一个整数数组,其中包含一些前导 0 的元素。 int arr[]={012,234,071}; cout<
如何从强制范围中删除前导,以便 Some field Any 1 2 3 « 最佳答案 删除 vertical-align: middle 后我觉得不错。 .mandato
我有这个 psd 并试图将它转换为 html css。 但是我无法从psd中计算出css中的行高。 如何根据前导+字体大小计算行高? 谢谢 最佳答案 如果行距不是自动的:LineHeight = fo
有谁知道如何更改文本字段上的行高(行距),最好是在 Interface Builder 中? 我已经找了大约一个小时了,但没有找到。 最佳答案 解决方法如下: Resizing NSTextField
是否可以在 C# 中的单元格元素(行)之间添加空格?我正在 Visual Studio 2012 中创建 pdf,并希望在行之间设置一些空间。我有这样的东西: PdfPTable cellTable
是否可以在 C# 中的单元格(行)元素之间添加空格?我正在 visual studio 2012 中创建一个 pdf,并希望在行之间设置一些空间。我有这样的东西: PdfPTable cellTabl
type ApplyFunc func(commitIndex uint64, cmd []byte) []byte 对于这个声明。我的理解是,这是一个函数指针。它的名字是 ApplyFunc。并且此
我很好奇多列索引的前导列的概念。 我正在使用这个示例 dvdrental分贝。 这是查询: SELECT title, length, rating, replacement_cost
我想将一个 double 格式格式化为最大长度为7的字符串,其中包含一个点“.”以及其后一位数字。 例如: 123.4 becomes "00123.4" 12345 becomes "12345
我需要正则表达式的帮助来从字符串中去除不需要的字符(在 Java 中)。我用 4 个正则表达式解决了这个问题。替换将被多次调用 [peeks: 50+ times/sec] 它并降低性能。但我认为它肯
只是将两个值连接到 mysql 表中的一列。 mysql 表中的第一个值和 PHP 常量中的第二个值保存为 define('ACCOUNTCODESUFFIX','016');。 MySql 查询有点
我如何按此顺序返回这些: 1: aaaa 2: bbbb 3: the cccc 4: dddd 所以忽略开头的“the” 目前我正在使用。 select * from houses order by
我通常使用以下代码将 PHP 变量导入 JavaScript: echo("var zipCode = " . $zipCode . ";"); 这工作正常,但对于以 0 开头的邮政编码,它会被 ch
有什么方法可以用前导 0 和小数来格式化 NSNumber 吗?例如,我需要有能力写 4.5 和 000。目前我有它允许小数,但不允许前导 0。 NSNumberFormatter *f = [[NS
你好我正在以编程方式创建标签栏,在我的功能中需要选择填充自定义颜色的标签,到目前为止我已经使用下面的代码实现了这一点,下面的输出见截图。 tabBarController.tabBar.selecti
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Integer with leading zeroes 有人能告诉我这是怎么回事吗?当我用前导零初始化一个
在 Xcode 6 中,我可以使用编辑器菜单来固定: 引领空间至超视 到 Superview 的尾随空间 顶部空间到Superview Superview的底部空间 我找不到在 Xcode 7 bet
我是一名优秀的程序员,十分优秀!