How to obtain object information in Python, and how to obtain object information in python
When we get an object reference, how do we know the object type and methods?
Use type ()
First, let's determine the object type and use the type () function:
You can use type () to determine the basic types:
>>> type(123)<type 'int'>>>> type('str')<type 'str'>>>> type(None)<type 'NoneType'>
If a variable points to a function or class, you can also use type () to judge:
>>> type(abs)<type 'builtin_function_or_method'>>>> type(a)<class '__main__.Animal'>
But what type is returned by the type () function? It returns the type. If we want to judge in the if statement, we need to compare whether the types of the two variables are the same:
>>> type(123)==type(456)True>>> type('abc')==type('123')True>>> type('abc')==type(123)False
However, this writing method is too troublesome. Python defines constants for each type and puts them in the types module. before using this method, you must first import:
>>> import types>>> type('abc')==types.StringTypeTrue>>> type(u'abc')==types.UnicodeTypeTrue>>> type([])==types.ListTypeTrue>>> type(str)==types.TypeTypeTrue
Finally, we noticed that there is a type called TypeType, and the types of all types are TypeType. For example:
>>> type(int)==type(str)==types.TypeTypeTrue
Use isinstance ()
It is inconvenient to use type () for the class inheritance relationship. To determine the class type, use the isinstance () function.
Let's review the previous example. If the inheritance relationship is:
Copy codeThe Code is as follows: object-> Animal-> Dog-> Husky
Then, isinstance () can tell us whether an object is of a certain type. Create three types of objects first:
>>> a = Animal()>>> d = Dog()>>> h = Husky()
Then, Judge:
>>> isinstance(h, Husky)True
No problem, because the h variable points to the Husky object.
Judge again:
>>> isinstance(h, Dog)True
H is of the Husky type, but since it is inherited from Dog, h is also of the Dog type. In other words, isinstance () determines whether an object is of this type or is located on the parent inheritance chain of this type.
Therefore, we can be sure that h or Animal type:
>>> isinstance(h, Animal)True
Similarly, the actual type is Dog's d and Animal type:
>>> isinstance(d, Dog) and isinstance(d, Animal)True
However, d is not of the Husky type:
The basic types that can be determined by type () can also be determined by isinstance:
>>> isinstance('a', str)True>>> isinstance(u'a', unicode)True>>> isinstance('a', unicode)False
You can also determine whether a variable is of certain types. For example, the following code can determine whether it is str or unicode:
>>> isinstance('a', (str, unicode))True>>> isinstance(u'a', (str, unicode))True
Because both str and unicode are inherited from basestring, you can also simplify the above Code:
>>> isinstance(u'a', basestring)True
Use dir ()
To obtain all attributes and methods of an object, you can use the dir () function, which returns a list containing strings. For example, you can obtain all attributes and methods of a str object:
>>> dir('ABC')['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Attributes and methods similar to _ xxx _ have special purposes in Python, such as the return length of the _ len _ method. In Python, if you call the len () function to obtain the length of an object, in fact, inside the len () function, it automatically calls the _ len _ () method of the object. Therefore, the following code is equivalent:
>>> len('ABC')3>>> 'ABC'.__len__()3
If you want to use len (myObj), write a _ len _ () method:
>>> class MyObject(object):... def __len__(self):... return 100...>>> obj = MyObject()>>> len(obj)100
The rest are common attributes or methods. For example, lower () returns a lowercase string:
>>> 'ABC'.lower()'abc'
It is not enough to list attributes and methods. In combination with getattr (), setattr (), and hasattr (), we can directly operate on the status of an object:
>>> class MyObject(object):... def __init__(self):... self.x = 9... def power(self):... return self.x * self.x...>>> obj = MyObject()
Then, you can test the attributes of the object:
>>> Hasattr (obj, 'x') # Is there an attribute 'X? True >>> obj. x9 >>> hasattr (obj, 'y') # Is there an attribute 'y? False >>> setattr (obj, 'y', 19) # Set an attribute 'y' >>> hasattr (obj, 'y') # Do you have an attribute 'y? True >>> getattr (obj, 'y') # Get the property 'y' 19 >>> obj. y # Get the property 'y' 19
If you try to obtain a property that does not exist, the error AttributeError will be thrown:
You can input a default parameter. If the property does not exist, the default value is returned:
>>> Getattr (obj, 'z', 404) # obtain the property 'Z'. If the property does not exist, the default value 404404 is returned.
You can also obtain the object method:
>>> Hasattr (obj, 'power') # Do you have the attribute 'power? True >>> getattr (obj, 'power') # obtain the attribute 'power' <bound method MyObject. power of <__ main __. myObject object at 0x0000ca35d0 >>> fn = getattr (obj, 'power') # obtain the attribute 'power' and assign the value to the variable fn >>> fn # fn points to obj. power <bound method MyObject. power of <__ main __. myObject object at 0x0000ca35d0 >>>> fn () # Call fn () and call obj. power () is the same 81
Summary
Through a series of built-in functions, we can analyze any Python object and obtain its internal data. Note that object information is obtained only when we do not know the object information. If you can directly write:
sum = obj.x + obj.y
Do not write:
sum = getattr(obj, 'x') + getattr(obj, 'y')
An example of a correct usage is as follows:
def readImage(fp): if hasattr(fp, 'read'): return readData(fp) return None
If we want to read images from the file stream fp, we must first determine whether the fp object has the read method. If so, the object is a stream and cannot be read if it does not exist. Hasattr () comes in handy.
Note that in dynamic languages such as Python, the read () method does not mean that the fp object is a file stream or a network stream, it may also be a byte stream in the memory, but as long as the read () method returns valid image data, it does not affect the image reading function.