如何在Python中轻松区分属性和方法?

如何在Python中轻松区分属性和方法?,python,naming-conventions,Python,Naming Conventions,让我们看看类float及其一些属性: [ ..., 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real'] 对于编码准则,我感到有点不安,因为我不知道哪个是属性,哪个是方法 例如,我如何轻松(不必尝试)知道是否需要编写foo.real或foo.real()。如果real是一个属性,为什么hex是一个方法 在一个项目中,我选择将方法命名为CamelCase,将属性命名为小写,

让我们看看类
float
及其一些属性:

[
 ...,
 'as_integer_ratio',
 'conjugate',
 'fromhex',
 'hex',
 'imag',
 'is_integer',
 'real']
对于编码准则,我感到有点不安,因为我不知道哪个是属性,哪个是方法

例如,我如何轻松(不必尝试)知道是否需要编写
foo.real
foo.real()。如果
real
是一个属性,为什么
hex
是一个方法

在一个项目中,我选择将方法命名为CamelCase,将属性命名为小写,但这与python编码样式不兼容


为什么我自己的标准不是一个好主意(我认为这不是一个好主意,因为Python选择了其他命名约定)?

命名约定总是主观的。没有明确的“最佳”选项,否则整个世界都会使用它,而且会跨语言使用它

命名约定最不主观的品质可能是它的应用的一致性。一个标准松散或遵守松散的团队最终可能会失去一致性,而一致性的丧失可能会导致对每个标识符的熟悉度的丧失和智力开销的增加。出于这个原因,如果一个团队能够始终如一地遵守规则和例外,那么有时候一个没有太多规则和例外的简单标准可能是可取的

对于PEP008编码指南,我感到有点不安,因为我 永远不知道哪个是属性,哪个是方法

这里值得注意的一点是,准确地说,我们可能应该声明您不知道标识符是表示属性还是基于其名称的方法

例如,我如何轻松(不必尝试)知道是否需要这样做 编写foo.real或foo.real()。如果实数是一个属性,为什么十六进制是 一种方法

除去丰富的IDE特性,命名约定通常不能帮助您预先知道某些东西是什么。例如,如果您将属性命名为
LikeThis
,将方法命名为
LikeThis
,那么我们将从方法中区分属性的智力开销转移到名称(“这叫什么?”而不是“这是什么?”)。然而,名称往往更为明显,更为突出(在文档、IDE和代码中),因此可能更容易记住、快速查找并跟踪哪种方式。这取决于你:这里每个人的里程数都可能有所不同

为什么我自己的标准不是一个好主意 因为Python选择了其他命名约定

头脑正常的人都不能说您的标准比Python的官方约定好或坏。然而,当你选择偏离官方标准时,你正在偏离惯用的道路

惯用代码往往是大多数人最熟悉的,几年后当您再次访问代码时,您自己也是如此。因为我们已经被它浸透了。各地的大多数Python示例都将使用官方的Python约定,您(稍微)偏离了这些约定。因此,它可能会使您的代码在其他人看来有点陌生,甚至可能在遥远的将来对您自己来说


然而,如果你真的对此有强烈的感觉,你可能会坚持你的标准。然而,当偏离官方标准时,这种风险值得牢记。

我同意你的观点:变量/属性和函数/方法的命名约定应该彼此不同。但是,我通常会做与您相反的事情——变量/属性使用驼峰大小写,函数/方法使用下划线分隔的小写单词。它使代码更容易阅读,这才是真正重要的。约定只是约定,不是硬性的义务。请记住,即使是Python的Zen也指出“可读性很重要”和“实用性胜过纯洁性”。而且,这并不是说你自己的标准不是一个好主意。每个人的思维方式都不同。对你最有效的就是对你最好的。但对每个人都有效的也很重要!是和否。如果你是唯一一个或主要一个看到你的代码的人,那么对每个人都有效的东西就不那么重要了。认真考虑这些约定是个好主意,但因为它们不是语言的要求,所以不必遵循它们。如果你有自己的理由去做不同的事情,那就放心吧。在我的领域(GIS),我会说大多数人使用CamelCase作为他们的函数名,因为大型GIS软件公司以这种方式编写了他们所有的工具(称为函数)。大多数GIS脚本编写者似乎认为这是Python的惯例。而且,没有任何东西“适合所有人”。这就是为什么现在有数百种编程语言在使用。如果我们都有相同的想法、相同的目标和相同的工具集,那么当然。这应该得到远远超过2票的支持!然而,您能否澄清一下“命名约定通常不能帮助您提前知道某件事”的含义?。谢谢。对于古老的回答,我很抱歉(很久没有这么说了),但我的意思是,在最初编写代码的过程中,您仍然需要知道“foo.x”是属性还是函数,例如,在使用它之前,您甚至可以首先编写代码,同样,使用“x”的代码在事后重新阅读时,通常会揭示它是属性还是函数。。。。。。通常,我们如何命名某个对象对我们没有多大帮助,除非您使用的IDE具有自动列出成员之类的功能,但在这一点上,IDE本身可能会告诉您该成员是函数还是属性,例如,这有点主观,但一般来说,我认为试图通过装饰和惯例来揭示事物的类型,以及它的命名方式,通常不会揭示或消除那么多的歧义。