2

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

例如emailpython中有一个模块

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__是属性,但是我们如何仅通过查看列表来区分所有/剩余的这些类型呢?

4

3 回答 3

4

它们都是属性,其中一些属性可能引用函数、某些类或对象。类似__this__的通常称为魔术方法

你可以看看:

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

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

您需要了解的有关接口的任何信息都可以在模块的文档中找到。各种属性的类型用处不大,重要性不高(dir也可能不完整)。

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

  • CamelCase上课
  • snake_case对于函数和方法
  • SHOUTY_CASE对于常数
  • _leading“私人”事物的下划线(即未记录的实现细节,不打算成为公共接口的一部分)
  • __double用于启用名称修饰的前导下划线,这是一种在复杂继承情况下处理可能的命名空间冲突的方法(一个非常晦涩的功能,您几乎可以肯定在正常使用中不需要)
  • __dunder__前面提到的魔术方法的“双下划线”,这些是 Python 本身的数据模型钩子。你可以重新定义现有的钩子来自定义你的类和模块中的行为,但不要仅仅为了你自己的目的发明新的魔法名称,而是使用普通属性。
于 2012-12-07T06:06:15.890 回答
0

这是你要找的吗?

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

于 2012-12-07T06:06:51.943 回答
0

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

你实际上想用你的代码来完成什么?

于 2012-12-07T06:04:47.650 回答