python是否与Java Class.forName()等效?

问题描述

python中的反射比Java中的反射更容易,更灵活。

没有直接函数(据我所知)具有完全限定的类名并返回该类,但是你拥有构建该类所需的所有组件,并且可以将它们连接在一起。

不过,有一点建议:使用python时不要尝试以Java风格进行编程。

如果你可以解释你要尝试的操作,也许我们可以帮助你找到一种更蟒蛇的方法

这是执行你想要的功能函数

def get_class( kls ):
    parts = kls.split('.')
    module = ".".join(parts[:-1])
    m = __import__( module )
    for comp in parts[1:]:
        m = getattr(m, comp)            
    return m

你可以使用该函数的返回值,就好像它是类本身一样。

这是一个用法示例:

>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.Now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>> 

这是如何运作的?

我们正在使用__import__导入保存该类的模块的方法,这要求我们首先从完全限定的名称提取模块名称。然后我们导入模块:

m = __import__( module )

在这种情况下,m只会引用顶级模块,

例如,如果你的类生活在foo.baz模块,然后m将模块foo ,我们可以很容易地获得一个参考foo.baz使用getattr( m, 'baz' )

要从顶层模块到达类,必须递归使用gettatr名称的各个部分

举例来说,如果你的班级名称是,foo.baz.bar.Model那么我们这样做:


m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model

这是此循环中发生的事情:

for comp in parts[1:]:
    m = getattr(m, comp) 

在循环的最后,m将是对该类的引用。这意味着m实际上是itslef类,你可以例如执行以下操作:

a = m() #instantiate a new instance of the class    
b = m( arg1, arg2 ) # pass arguments to the constructor

解决方法

python

我需要使用字符串参数并在Python中创建以该字符串命名的类的对象。在Java中,我会使用Class.forName().newInstance()。在Python中是否有等同功能?

感谢你的答复。回答那些想知道我在做什么的人:我想使用命令行参数作为类名,并实例化它。我实际上是在Jython中编程并实例化Java类,因此是问题的Java实质。 getattr()效果很好。非常感谢。

相关文章

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?