如何轻松区分Python中的属性和方法?
How to easily differentiate between attributes and methods in Python?
让我们来看看 class float
和它的一些属性:
[
...,
'as_integer_ratio',
'conjugate',
'fromhex',
'hex',
'imag',
'is_integer',
'real']
有了PEP008编码准则,我感到有点不安,因为我不知道哪个是属性,哪个是方法。
例如,我如何轻松(无需尝试)知道是否需要写 foo.real
或 foo.real()
。如果 real
是属性,为什么 hex
是方法?
在一个项目中,我选择用 CamelCase 命名我的方法,并用小写字母命名我的属性,但这不符合 python 编码风格。
为什么我自己的标准不是一个好主意(我认为这不是一个好主意,因为 Python 选择了其他命名约定)?
命名约定总是主观的。没有明确的 "best" 否则整个世界都会跨语言使用它。
命名约定中最不主观的品质可能是其应用的一致性。一个标准松散或对标准松散遵守的团队最终可能会失去一致性,而一致性的丧失会导致熟悉度的降低和每个标识符的智力开销增加。出于这个原因,有时可能需要一个没有太多规则和例外的更简单的标准,如果它增加了团队始终遵守它们的可能性。
With the PEP008 coding guidelines, I feel a bit disturbed because I
never know which is a property and which is a method.
这里值得注意的一件事是,为了准确起见,我们可能应该声明您不知道标识符代表的是 属性 还是方法 基于其名称.
For example, how can I easily (without trying) know whether need do
write foo.real or foo.real(). If real is an attribute, why does hex is
a method?
除了丰富的 IDE 功能,命名约定通常不能帮助您不必提前知道什么是什么。例如,如果你命名属性 LikeThis
和方法 like_this
,那么我们将区分属性和方法的智能开销转移到名称 ("what is this called?"而不是 "what is this?")。但是,名称往往更明显一点,更突出(在文档、IDE 和代码中),因此它可能更容易记住、快速找出并跟踪哪个是那个。这取决于你:每个人的里程可能会有所不同。
Why is my own standards not a good idea (I assume it is not a good
idea because Python chose other naming conventions)?
任何头脑正常的人都不能说您的标准比 Python 的官方惯例更好或更差。然而,当你选择偏离官方标准时,你就偏离了惯用的道路。
地道的代码往往是大多数人最熟悉的代码,也是您多年后重新访问代码时对自己最熟悉的代码。这是因为我们被它浸透了。大多数 Python 示例都将使用官方 Python 约定,您(稍微)偏离了这些约定。所以它可能会让你的代码对其他人来说有点陌生,甚至可能在遥远的未来对你自己来说。
尽管如此,如果您真的对此有强烈的感觉,您还是会坚持自己的标准。然而,当偏离官方标准时,这种风险值得牢记。
让我们来看看 class float
和它的一些属性:
[
...,
'as_integer_ratio',
'conjugate',
'fromhex',
'hex',
'imag',
'is_integer',
'real']
有了PEP008编码准则,我感到有点不安,因为我不知道哪个是属性,哪个是方法。
例如,我如何轻松(无需尝试)知道是否需要写 foo.real
或 foo.real()
。如果 real
是属性,为什么 hex
是方法?
在一个项目中,我选择用 CamelCase 命名我的方法,并用小写字母命名我的属性,但这不符合 python 编码风格。
为什么我自己的标准不是一个好主意(我认为这不是一个好主意,因为 Python 选择了其他命名约定)?
命名约定总是主观的。没有明确的 "best" 否则整个世界都会跨语言使用它。
命名约定中最不主观的品质可能是其应用的一致性。一个标准松散或对标准松散遵守的团队最终可能会失去一致性,而一致性的丧失会导致熟悉度的降低和每个标识符的智力开销增加。出于这个原因,有时可能需要一个没有太多规则和例外的更简单的标准,如果它增加了团队始终遵守它们的可能性。
With the PEP008 coding guidelines, I feel a bit disturbed because I never know which is a property and which is a method.
这里值得注意的一件事是,为了准确起见,我们可能应该声明您不知道标识符代表的是 属性 还是方法 基于其名称.
For example, how can I easily (without trying) know whether need do write foo.real or foo.real(). If real is an attribute, why does hex is a method?
除了丰富的 IDE 功能,命名约定通常不能帮助您不必提前知道什么是什么。例如,如果你命名属性 LikeThis
和方法 like_this
,那么我们将区分属性和方法的智能开销转移到名称 ("what is this called?"而不是 "what is this?")。但是,名称往往更明显一点,更突出(在文档、IDE 和代码中),因此它可能更容易记住、快速找出并跟踪哪个是那个。这取决于你:每个人的里程可能会有所不同。
Why is my own standards not a good idea (I assume it is not a good idea because Python chose other naming conventions)?
任何头脑正常的人都不能说您的标准比 Python 的官方惯例更好或更差。然而,当你选择偏离官方标准时,你就偏离了惯用的道路。
地道的代码往往是大多数人最熟悉的代码,也是您多年后重新访问代码时对自己最熟悉的代码。这是因为我们被它浸透了。大多数 Python 示例都将使用官方 Python 约定,您(稍微)偏离了这些约定。所以它可能会让你的代码对其他人来说有点陌生,甚至可能在遥远的未来对你自己来说。
尽管如此,如果您真的对此有强烈的感觉,您还是会坚持自己的标准。然而,当偏离官方标准时,这种风险值得牢记。