我需要使用字符串参数并在Python中创建以该字符串命名的类的对象。在Java中,我会使用Class.forName().newInstance()
。在Python中是否有等同功能?
感谢你的答复。回答那些想知道我在做什么的人:我想使用命令行参数作为类名,并实例化它。我实际上是在Jython中编程并实例化Java类,因此是问题的Java实质。 getattr()
效果很好。非常感谢。
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
问题内容: 好的,我想知道的是Java有什么方法可以执行以下Python可以做到的… 因为在我看来Java可以使您获得相同的结果(我特别需要每次使用2个数字,而缺少-1来表示最后一个字符) 我还没有用Java来研究数组/列表,所以真正希望Java比这更容易 编辑:将string_sample [3]的“ i”修改为“ l”。很好看的Maroun! 问题答案: 抱歉,Java的灵活性不如Python
问题内容: 有人知道类似于JavaRobot的Python类吗? 具体来说,我想在Ubuntu中执行屏幕抓取,并最终跟踪鼠标单击和键盘按下(尽管这是一个稍微不同的问题)。 问题答案: 如果您有GTK,则可以使用gtk.gdk.Display类来完成大部分工作。它控制键盘/鼠标指针获取一组对象。
问题内容: 我有两个对象,想要将它们配对,就像中的函数一样。我很确定JDK中没有此功能,但是在相当广泛的库中是否有类似通用收藏集的类似内容?谢谢。 问题答案: 功能Java具有zip,zipWith以及zipIndex您对或的期望。(实际上,作者几乎都是Haskell程序员。)
我是MySQL的新手。我有以下SQL查询,并尝试转换为mysql,为表create脚本中的日期列提供默认值。 但在MySQL中不支持。获取以下错误。 错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以了解第1行“(-1),sysutcdatetime())”附近使用的正确语法 此外,我还需要以以下格式获取日期'9999-12-31 23:59:59.99999
问题内容: 最近,我遇到了一些Java代码,这些代码简单地将一些字符串放入Java TreeSet中,为其实现了基于距离的比较器,然后在日落时分快乐地计算出给定的分数来解决给定的问题。 我的问题 是否有适用于Python的等效数据结构? Java树集看起来基本上是一个有序字典,可以使用某种比较器来实现这种排序。 我看到有一个用于 OrderedDict的Py3K的PEP,但是我使用的是2.6.x。
问题内容: 有人知道类似于JavaRobot的Python类吗? 具体来说,我想在Ubuntu中执行屏幕抓取,并最终跟踪鼠标单击和键盘按键(尽管这是一个稍微不同的问题)。 问题答案: 如果您有GTK,则可以使用gtk.gdk.Display类来完成大部分工作。它控制键盘/鼠标指针获取一组对象。