Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查模块属性是否为类_Python - Fatal编程技术网

Python 如何检查模块属性是否为类

Python 如何检查模块属性是否为类,python,Python,我正在使用imp.find_模块,然后imp.load_模块加载“示例”,现在,我只想列出example.py中属于Class a函数的函数,但我似乎找不到类特有的getattr属性,该属性将过滤掉dir(示例)中的所有其他方法 目录中的i的(示例): 如果hasattr(getattr(示例,i),): 打印i 如果您搜索现有的解决方案,请使用内置模块,它有很多功能可以针对特定类型进行测试,适合您的情况: import inspect class Foo(object): pass

我正在使用
imp.find_模块
,然后
imp.load_模块
加载
“示例”
,现在,我只想列出
example.py
中属于
Class a
函数的函数,但我似乎找不到类特有的
getattr
属性,该属性将过滤掉
dir(示例)
中的所有其他方法

目录中的i的
(示例):
如果hasattr(getattr(示例,i),):
打印i

如果您搜索现有的解决方案,请使用内置模块,它有很多功能可以针对特定类型进行测试,适合您的情况:

import inspect

class Foo(object):
    pass

if inspect.isclass(Foo):
   print("Yep, it's class")
然而,如果你想深入研究,几乎没有其他方法

  • 在Python中,一切都是某物的实例。类不是排除项,它们是元类的实例。在Python2中有两种类型的类-旧样式(
    classfoo:pass
    )和新样式(
    classfoo(object):pass
    )。旧样式的类是
    classobj
    的实例,可见为
    类型.ClassType
    ,而新样式的类是
    类型
    的实例,它本身同时是函数和元类(严格来说是可调用的元类)。在Python3中,只有一些新样式的类,它们总是从
    对象
    (它又是
    类型
    的实例)派生而来

    因此,您可以检查
    Foo
    是否是类,方法是发出if是元类生成类的实例:

    class Foo(object):
        pass
    
    if isinstance(Foo, type):
        print("Yep, it's new-style class")
    
    或者对于旧式:

    import types
    
    class Foo:
        pass
    
    if isinstance(Foo, types.ClassType):
        print("Yep, it's old-style class")
    
  • 你也可以看看和


  • 发现isinstance(getattr(V,i),(type,types.ClassType))似乎也能工作——但现在我遇到了第二个问题。假设示例中有一个从另一个库导入的类,如何仅获取本地类?这是另一个问题,请在此处发布链接,我将在此处发布答案-为了顺序起见。我猜提问时间限制为90分钟,稍后我将发布。简言之,由于种种原因,并没有100%的方法来确定did课程的来源。但对于类由class关键字定义的情况,有
    \uuuu module\uuu
    字段,它是包含定义的模块的字符串名称。请注意,可能存在名称冲突(
    foo.foo
    bar.foo.foo
    是来自不同模块的不同类,但是
    \uuuu模块\uuuu
    在这两种情况下都将是
    foo
    ,AFAIK),以及
    \uu模块\uuu
    可能是无的(对于动态类和内置类)。这里需要注意的是,类引用可能会被重新分配
    Foo
    在模块
    bar
    中定义,但模块
    buzz
    在内部导入
    bar
    并再次导出
    Foo
    。因此,
    buzz.Foo.\uuuu模块将是(令人惊讶的!)
    'bar'
    ,而不是人们所期望的
    'buzz'
    。处理它或者重新设计你的应用程序(因为如果你需要这类信息,你几乎100%都在做一些疯狂的事情或者一些可怕的错误)。顺便说一句,“模块方法”这个词是错误的。方法始终是函数,您访问的是模块属性。所有的方法(最初)都是属性,并非所有的属性都是方法。此外,除了交互式提示之外,在任何地方使用
    dir()
    都被认为是不好的做法,因为它速度慢且不一致。如果出于某种原因需要访问属性列表,请迭代
    \uuuu dict\uuuu
    \uuu slots\uuuu
    import types
    
    class Foo:
        pass
    
    if isinstance(Foo, types.ClassType):
        print("Yep, it's old-style class")