When we get a reference to an object, how do we know what kind of object it is and what are the methods?
use Type ()
First, we'll determine the object type, using the type () function:
Basic types can be judged by type ():
>>> 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 determine:
>>> type (ABS)
<type ' Builtin_function_or_method ' >
>>> Type (a)
<class ' __ main__. Animal ' >
But what types does the type () function return? It returns type types. If we want to judge in an if statement, we need to compare the type types of two variables to be the same:
>>> type (123) ==type (456)
true
>>> type (' abc ') ==type (' 123 ')
true
>> > Type (' abc ') ==type (123)
False
But this kind of writing is too troublesome, Python has defined constants for each type, placed in the types module, before using, you need to import:
>>> Import Types
>>> type (' abc ') ==types. StringType
True
>>> type (U ' abc ') ==types. Unicodetype
True
>>> type ([]) ==types. ListType
True
>>> type (str) ==types. Typetype
True
Finally, it is noted that there is a type called typetype, and that the type of all types is typetype, such as:
>>> type (int) ==type (str) ==types. Typetype
True
Using Isinstance ()
It is inconvenient to use type () for the inheritance relationship of class. To determine the type of class, you can use the Isinstance () function.
We review the last example if the inheritance relationship is:
Copy Code code as follows:
Object-> Animal-> Dog-> Husky
So, isinstance () can tell us if an object is of some kind. Create 3 types of objects First:
>>> a = Animal ()
>>> d = Dog ()
>>> h = Husky ()
Then, Judge:
>>> isinstance (H, Husky)
True
No problem, because the H variable is pointing to the Husky object.
To judge again:
>>> isinstance (H, Dog)
True
H is a type of husky, but since husky is inherited from dog, H is also dog. In other words, isinstance () determines whether an object is the type itself, or is located on the parent inheritance chain of that type.
So, we can be sure that H is still the animal type:
>>> isinstance (H, Animal)
True
Similarly, the actual type is dog D is also the animal type:
>>> Isinstance (d, Dog) and Isinstance (d, Animal)
True
However, D is not a husky type:
Basic types that can be judged by type () can also be judged by isinstance ():
>>> isinstance (' a ', str)
true
>>> isinstance (U ' a ', Unicode)
true
>>> Isinstance (' A ', Unicode)
False
You can also determine whether a variable is one of several types, such as the following code to determine whether it is STR or Unicode:
>>> isinstance (' A ', (str, Unicode))
true
>>> isinstance (U ' A ', (str, Unicode))
true
Since both STR and Unicode are inherited from Basestring, the above code can also be simplified to:
>>> isinstance (U ' a ', basestring)
True
Using Dir ()
If you want to get all the properties and methods of an object, you can use the Dir () function, which returns a list containing the strings, for example, to get all the properties 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 ', ' Splitli Nes ', ' startswith ', ' strip ', ' swapcase ', ' title ', ' Translate ', ' upper ', ' Zfill ']
Properties and methods like __xxx__ are used in Python for special purposes, such as the __len__ method returns the length. In Python, if you call the Len () function to try to get the length of an object, in fact, within the Len () function, it automatically invokes the object's __len__ () method, so the following code is equivalent:
>>> len (' abc ')
3
>>> ' abc '. __LEN__ ()
3
We write our own class, if we also want to use Len (myobj), we write a __len__ () method:
>>> class MyObject (object):
... def __len__ (self):
... Return
...
>>> obj = MyObject ()
>>> len (obj)
100
The rest are normal properties or methods, such as lower (), which returns a lowercase string:
>>> ' abc '. LOWER ()
' abc '
Simply listing the attributes and methods is not enough, with GetAttr (), SetAttr (), and hasattr (), we can manipulate the state of an object directly:
>>> class MyObject (object):
... def __init__ (self):
... self.x = 9
... def power (self):
... return self.x * self.x ...
>>> obj = MyObject ()
Immediately thereafter, you can test the properties of the object:
>>> hasattr (obj, ' x ') # has attribute ' x '?
True
>>> obj.x
9
>>> hasattr (obj, ' y ') # has attribute ' y '?
False
>>> setattr (obj, ' y ', 19) # set an attribute ' y '
>>> hasattr (obj, ' y ') # has attribute ' y '?
True
>>> getattr (obj, ' y ') # get attribute ' y '
>>> obj.y # Get property ' y '
19
If you attempt to obtain a property that does not exist, a attributeerror error is thrown:
You can pass in a default parameter, and if the property does not exist, return the defaults:
>>> getattr (obj, ' z ', 404) # Get property ' Z ', if not present, return default value 404
404
You can also obtain the object's methods:
>>> hasattr (obj, ' power ') # has attribute ' power '?
True
>>> getattr (obj, ' power ') # Gets the property ' power '
<bound method Myobject.power of <__main__. MyObject object at 0x108ca35d0>>
>>> fn = getattr (obj, ' power ') # get attribute ' power ' and assign value to variable fn
>> > fn # fn points to Obj.power
<bound method Myobject.power of <__main__. MyObject object at 0x108ca35d0>>
>>> fn () # calling FN () is the same as calling Obj.power ()
81
Summary
With a built-in series of functions, we can dissect any Python object and get the data inside. It should be noted that only when we do not know the object information, we will go to get the object information. If you can write directly:
Don't write it:
sum = getattr (obj, ' x ') + getattr (obj, ' y ')
An example of the correct usage is as follows:
def readimage (FP):
if Hasattr (FP, ' read '): Return
readdata (FP) return
None
Assuming that we want to read the image from the file stream FP, we first need to determine whether the FP object exists a read method, and if so, it is a stream and cannot be read if it does not exist. Hasattr () came in handy.
Note that in a dynamic language like Python, the Read () method does not mean that the FP object is a file stream, it may also be a network stream, or it may be a byte stream in memory, but as long as the Read () method returns valid image data, it does not affect the function of reading the image.