Python 反射和类型转换
Posted
技术标签:
【中文标题】Python 反射和类型转换【英文标题】:Python Reflection and Type Conversion 【发布时间】:2010-10-11 22:50:29 【问题描述】:在Python中,str()、int()、float()等函数一般用于进行类型转换。但是,这些要求您在开发时知道要转换为哪种类型。我正在尝试编写的一些 Python 代码的子问题如下:
给定两个变量foo
和bar
,求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 反射和类型转换的主要内容,如果未能解决你的问题,请参考以下文章