栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 )>>> adatetime.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 foom = getattr( m, "baz" ) #m is package bazm = getattr( m, "bar" ) #m is module barm = 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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385735.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号