Problem: What is the best way to check whether a given object is of a given type? For example, if you have a variable object
, how to check if it’s a string
?
Check with Subclasses
Solution: To check if an object
is an instance of str
or any of its subclasses, use isinstance
:
if isinstance(o, str): print(o, 'is of type string')
Note that if the object inherits from string, the result of isinstance(o, str)
will also be True
.
Here’s an example:
class Car: def speed(self): return 100 class Sportscar(Car): def speed(self): return 200 vw = Car() porsche = Sportscar() print(isinstance(vw, Car)) # True print(isinstance(porsche, Sportscar)) # True print(isinstance(porsche, Car)) # True --> Inherit being a Car from being a Sportscar
The example shows that the vw
is a Car
and the porsche
is a Sportscar
. However, as a Sportscar
inherits from Car
, the porsche
is also a Car
.
However, you could argue that checking for type shouldn’t include checking for subclasses. So, in this example, the porsche
instance should not be a Car
. Let’s have a look how to accomplish this next!
Check without Subclasses
Solution 2: To check if an object
is an instance of str
, excluding subclasses, use Python’s built-in function type(object)
and check if it’s the same as str
using the keyword is
.
obj = 'hello' if type(obj) is str: print(obj, 'is of type string (it is not a subclass)')
The output is:
hello is of type string (it is not a subclass)
Similarly, if you use the same class example as before, the porsche
would now not be a Car
—even though it’s a Sportscar
!
class Car: def speed(self): return 100 class Sportscar(Car): def speed(self): return 200 vw = Car() porsche = Sportscar() print(type(vw) is Car) # True print(type(porsche) is Sportscar) # True print(type(porsche) is Car) # False --> Inherit being a Car from being a Sportscar but is not of type Car
Resources: You may also enjoy to check out the following resources about Python typing: