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")
然而,如果你想深入研究,几乎没有其他方法
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")