【问题标题】:How to differentiate between classes, functions, and methods如何区分类、函数和方法
【发布时间】:2012-11-25 07:33:20
【问题描述】:

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

【问题讨论】:

    标签: python class function methods attributes


    【解决方案1】:

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

    你可以看看:

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

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

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

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

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

    【讨论】:

    • 是的,这很有帮助,看起来像这样
    【解决方案2】:

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

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

    【讨论】:

    • 其实当我们知道一个模块名却不知道如何使用的时候,模块中存在哪些函数、类、属性、方法,它们有什么用途? ....所以我的意思是问这些问题,是的,当然,如果我们想知道类型,我们需要使用 type(attribute) 检查每个属性,并且我们可以找到每个属性可以用于什么通过在 python 中使用一些默认函数,所以我想知道而不是使用 type(attribute) 搜索每个元素,
    • 无论如何我之前提到的所有类别之间都有区别......
    • @Kouripm:如果您想知道如何使用模块,请查看文档。 dir 不应替代文档。
    【解决方案3】:

    这是你要找的吗?

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

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2017-05-06
      • 1970-01-01
      • 2015-10-06
      • 2013-11-25
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多