
如有翻译问题欢迎评论指出,谢谢。
之前有一篇类似的译(三十一)-Python获取变量类型,这次的是另一个角度的方法和解答,更详细。
Python 获取类型的标准方法
-
Herge asked
- 判断对象类型的最好方式是什么?以及如何确定对象是否继承于给定的类型?
- 例如有一个对象
o
,如何确定它是不是str
?
-
Answers
-
Fredrik Johansson – vote 1828
-
判断
o
是否为str
或其子类,使用 isinstance (这是标准方式): -
if isinstance(o, str)
-
判断
o
是否为str
(不包括其子类): -
if type(o) is str
-
下面的语句也有效,并且在一些情况下很有用:
-
if issubclass(type(o), str)
-
见 Python 库参考的内置函数以获取更多信息。
-
此外,如果是用 Python 2,你需要的可能是这个:
-
if isinstance(o, basestring)
-
因为这会将 Unicode 字符串也纳入考虑(
unicode
不是str
的子类;str
与unicode
都是basestring
的子类)。而 Python 3 移除了basestring
,对于字符串(str
) 和二进制数据(bytes
)有了严格区分。 -
此外,
isinstance
可以以类的元组作为参数。如果o
是(str, unicode)
的实例或子类 将返回True
: -
if isinstance(o, (str, unicode))
-
Dan Lenski – vote 239
-
最Python式的判断方法是…不要判断它。
-
因为 Python 鼓励鸭子类型,所以应该用
try...except
,按你希望的方式来使用这个对象的方法。所以如果你的函数是寻找一个可写的文件对象,不要去判断它是否是file
的子类,直接用它的.write()
方法即可。 -
的确有时这些漂亮的抽象会失灵,那么
isinstance(obj, cls)
就变成你需要的,但还是得少用它。 -
Herge – vote 65
-
isinstance(o, str)
将返回True
,如果o
是str
或继承于str
。 -
仅当
o
是str
而非其子类时,type(o) is str
会返回True
。它会返回False
如果o
继承于str
。
-
What’s the canonical way to check for type in Python
-
Herge asked
- What is the best way to check whether a given object is of a given type? How about checking whether the object inherits from a given type?
判断对象类型的最好方式是什么?以及如何确定对象是否继承于给定的类型? - Let’s say I have an object
o
. How do I check whether it’s astr
?
例如有一个对象o
,如何确定它是不是str
?
- What is the best way to check whether a given object is of a given type? How about checking whether the object inherits from a given type?
-
Answers
-
Fredrik Johansson – vote 1828
-
To check if
o
is an instance ofstr
or any subclass ofstr
, use isinstance (this would be the canonical way)
判断o
是否为str
或其子类,使用 isinstance (这是标准方式): -
if isinstance(o, str)
-
To check if the type of
o
is exactlystr
(exclude subclasses):
判断o
是否为str
(不包括其子类): -
if type(o) is str
-
The following also works, and can be useful in some cases:
下面的语句也有效,并且在一些情况下很有用: -
if issubclass(type(o), str)
-
See Built-in Functions in the Python Library Reference for relevant information.
见 Python 库参考的内置函数以获取更多信息。 -
One more note in this case, if you’re using Python 2, you may actually want to use:
此外,如果是用 Python 2,你需要的可能是这个: -
if isinstance(o, basestring)
-
because this will also catch Unicode strings (
unicode
is not a subclass ofstr
; bothstr
andunicode
are subclasses ofbasestring
). Note thatbasestring
no longer exists in Python 3, where there’s a strict separation of strings (str
) and binary data (bytes
).
因为这会将 Unicode 字符串也纳入考虑(unicode
不是str
的子类;str
与unicode
都是basestring
的子类)。而 Python 3 移除了basestring
,对于字符串(str
) 和二进制数据(bytes
)有了严格区分。 -
Alternatively,
isinstance
accepts a tuple of classes. This will returnTrue
ifo
is an instance of any subclass of any of(str, unicode)
:
此外,isinstance
可以以类的元组作为参数。如果o
是(str, unicode)
的实例或子类 将返回True
: -
if isinstance(o, (str, unicode))
-
Dan Lenski – vote 239
-
The most Pythonic way to check the type of an object is… not to check it.
最Python式的判断方法是…不要判断它。 -
Since Python encourages Duck Typing, you should just
try...except
to use the object’s methods the way you want to use them. So if your function is looking for a writable file object, don’t check that it’s a subclass offile
, just try to use its.write()
method!
因为 Python 鼓励鸭子类型,所以应该用try...except
,按你希望的方式来使用这个对象的方法。所以如果你的函数是寻找一个可写的文件对象,不要去判断它是否是file
的子类,直接用它的.write()
方法即可。 -
Of course, sometimes these nice abstractions break down and
isinstance(obj, cls)
is what you need. But use sparingly.
的确有时这些漂亮的抽象会失灵,那么isinstance(obj, cls)
就变成你需要的,但还是得少用它。 -
Herge – vote 65
-
isinstance(o, str)
will returnTrue
ifo
is anstr
or is of a type that inherits fromstr
.isinstance(o, str)
将返回True
,如果o
是str
或继承于str
。 -
type(o) is str
will returnTrue
if and only ifo
is a str. It will returnFalse
ifo
is of a type that inherits fromstr
.
仅当o
是str
而非其子类时,type(o) is str
会返回True
。它会返回False
如果o
继承于str
。
-
近期评论