如何区分类,函数和方法

时间:2012-12-07 05:59:44

标签: python class function methods attributes

在Python中,dir()函数用于显示传递给它的参数的属性,类,方法,对吧?

例如,python中有一个模块email

import email
dir(email)

结果:

['Charset', 'Encoders', 'Errors', 'FeedParser', 'Generator', 'Header', 'Iterators', 'LazyImporter', 'MIMEAudio', 'MIMEBase', 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', 'MIMENonMultipart', 'MIMEText', 'Message', 'Parser', 'Utils', '_LOWERNAMES', '_MIMENAMES', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_name', 'base64MIME', 'email', 'importer', 'message_from_file', 'message_from_string', 'mime', 'quopriMIME', 'sys']

所以我想知道的是如何判断上面列表中的给定对象是属性,方法,类还是函数。

从上面的列表中,我们可以预期__all____builtins____doc__等是属性,但我们如何通过查看来区分这些类型的所有/剩余清单?

3 个答案:

答案 0 :(得分:4)

它们是所有属性,其中一些属性可能引用函数,某些类或对象。像__this__这样的人是magic methods

你可以看一下:

[type(getattr(email, x)) for x in dir(email)]

但最好的答案是:“我在乎什么?”

您需要了解有关该接口的任何信息,请参阅该模块的文档。各种属性的类型用处不大,重要性低(dir也不完整)。

所以不要打扰类型检查。值得了解(并使用)python命名约定(参见pep8):

  • CamelCase用于课程
  • lower_with_underscores了解功能和方法
  • SHOUTY_CASE for constants
  • _leading强调“受保护”的内容(即不打算成为公共界面的一部分)
  • __double强调“私人”事物的下划线(类似于上面的内容,但名称更糟)
  • __underline__如前所述的魔术方法

答案 1 :(得分:0)

你不能,而不是“仅通过查看列表”。所有这些都是属性。其中一些也可能是方法,函数或类等,但您无法通过查看列表来判断。你必须看看实际的对象。例如,您可以使用callable(email.Encoders)来确定email.Encoders是否可调用。您可以使用type(email.Encoders)找出它是什么类型。或者,更有可能的是,您不会执行这些操作,因为您知道需要使用哪些方法/类/函数,并且在不使用dir的情况下使用它们。

您实际上想用代码完成什么?

答案 2 :(得分:0)

这是你要找的吗?

[type(getattr(email, x)) for x in dir(email)]