Python 反射和类型转换

Posted

技术标签:

【中文标题】Python 反射和类型转换【英文标题】:Python Reflection and Type Conversion 【发布时间】:2010-10-11 22:50:29 【问题描述】:

在Python中,str()、int()、float()等函数一般用于进行类型转换。但是,这些要求您在开发时知道要转换为哪种类型。我正在尝试编写的一些 Python 代码的子问题如下:

给定两个变量foobar,求foo 的类型。 (在开发时不知道,因为这是通用代码。)然后,尝试将bar 转换为foo 的任何类型。如果这不能完成,则抛出异常。

例如,假设您调用了执行此操作的函数conv。它的签名看起来像

def conv(foo, bar) :
    # Do stuff.

它会被称为:

result = conv(3.14, "2.718")  # result is now 2.718, as a float.

【问题讨论】:

【参考方案1】:

这样最好:

type(foo)(bar)

【讨论】:

仅在 Python 3.0 中。在 Python 2.x 中,这仅适用于“新型类”和内置函数。【参考方案2】:

使用foo.__class__ 获取foo 的类型。然后调用它将 bar 转换为 foo 的类型:

def conv(foo, bar) :
    return foo.__class__(bar)

当然,这只有在 foo 的类型有一个知道如何转换 bar 的构造函数时才有效。

【讨论】:

令人印象深刻。我从来没有想过它会如此简单。同样令人惊讶的是(我是 Python 新手,并且习惯于更接近金属语言)它可以与内置函数一起使用。 部分不正确。 foo.__class__ 只是 foo 的类型,如果 foo 是一个新样式的对象。否则,它只是类。 唯一不正确的,因为当类更精确时我说“类型”。但是他需要这个转换的类。而在 Python 3 中,差异已经消失了。【参考方案3】:
type(foo)

绝对是最好的,如果你想检查一个类型,那么“类型”是最好的方法,我在python 2.7 - 3.2.2, type() 上工作得很好。

【讨论】:

以上是关于Python 反射和类型转换的主要内容,如果未能解决你的问题,请参考以下文章

反射给对象赋值——类型转换

没有泛型参数的反射转换为类型

反射如何判断对象类型并实现强中类型转换

是否可以在Scala反射中将字符串转换为类型?

Go Web编程实战----反射

Go Web编程实战----反射