我有一个变量列表..列表中有字符串,数字和类对象。我需要根据每种不同类型的数据执行逻辑。我在检测类对象和分支逻辑时遇到问题。
if(type(lists[listname][0]).__name__ == 'str'): # <--- this works for strings
elif(type(lists[listname][0]).__name__ == 'object'): <--- this does not work for classes
在上面第二行代码中, name 变量包含“Address”作为类名。我希望它包含“类”或“对象”所以我可以分支我的程序。我将来会有很多不同类型的对象,所以在每个不同的类名“地址”“人”等上执行逻辑是不切实际的
如果我的问题需要澄清,请告诉我。
谢谢!
答案 0 :(得分:4)
仅供参考:如果它是一个新风格的类,它也会有所不同:
# python
type(1).__name__
'int'
type('1').__name__
'str'
class foo(object):
pass
type(foo()).__name__
'foo'
class bar:
pass
type(bar()).__name__
'instance'
如果你可以确保它们都是新式的类,你的方法将决定真正的类型。如果你把它们变成旧式,它将显示为“实例”。并不是说我建议只为此制作所有旧式的。
但是,您可以更进一步:
type(bar().__class__).__name__
'classobj'
type(foo().__class__).__name__
'type'
始终寻找'classobj'或'type'。 (或者元类的名称,如果有的话。)
答案 1 :(得分:2)
我想你想要isinstance
功能。
if isinstance(o, ClassName):
但是,您需要先验证o
是否为对象,然后才能使用type
。
答案 2 :(得分:2)
在Python中常见的是使用异常处理来决定采用哪个代码路径;不鼓励检查对象的确切类型(使用isinstance())来决定如何处理它。
例如,假设您想要做的是,如果它是一个字符串,则将其打印在“标题大小写”中,如果它是一个对象,则需要在其上调用特定方法。所以:
try:
# is it an object with a particular method?
lists[listname][0].particularMethod()
except AttributeError:
# no, it doesn't have particularMethod(),
# so we expect it to be a string; print it in title case
print lists[listname][0].title()
答案 3 :(得分:-1)
如果您只对具体处理两种类型感兴趣,可以使用isinstance
显式测试它们,然后处理剩余物:
import numbers
for item in list:
if isinstance(item, basestring): # (str, unicode)
do_string_thing(item)
elif isinstance(item, numbers.Real): # (int, float, long)
do_number_thing(item)
else:
do_object_thing(item)