Python’s magic methods are those predefined functions in Python like __XXX__
.
The biggest advantage of using Python's magic methods is that python provides simple methods to allow objects to behave like built-in types.
__str__
The function is used to process the output content when printing the instance itself. If this function is not overridden, an object name and memory address are output by default.
For example:
>>> class Student(object): ... def __init__(self,name): ... self._name = name ... >>> print Student()
Output: <__main__.Student object at 0x0000000002A929E8>
.
So how do we make the output results more readable? We can override the __str__
function. For example, the output result of
>>> class Student(object): ... def __init__(self, name): ... self._name = name ... def __str__(self): ... return "I'm a student, named %s" % self._name ... >>> print Student("Charlie")
is: I'm a student, named Charlie
.
When we apply the str()
function to the object, in fact It is the __str__
function that calls the object.
__repr__
also serializes objects, but __repr__
is more for the python compiler watch. __str__
It’s more about readability.
When we use the repr()
function to touch an object, what we call is actually the __repr__
function of the function.
Paired with repr()
is the eval()
function. eval()
The function is to convert the serialized object back into an object. The premise is that the object implements the __repr__
function.
The above paragraph is based on my own understanding, I don’t know whether it is right or wrong.
>>> item = [1,2,3] >>> repr(item) '[1, 2, 3]' >>> other_item = eval(repr(item)) >>> other_item[1] 2
We often use for...in... to iterate on lists or tuples. That is list inherits from Iterable. Iterable implements the __iter__ function.
If you want to turn a custom object into an iterable object, you must implement two methods: __iter__
and next
.
__iter__
The function returns an object. When iterating, the next
function will be continuously called to get the next value until StopIteration
is captured.
Teacher Liao Xuefeng’s tutorial writes the __next__
method, I don’t know why.
class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def next(self): self.a, self.b = self.b, self.a + self.b if self.a > 10000: raise StopIteration return self.a for i in Fib(): print i
The above implements the iteration of objects by implementing the __iter__
function.
So how to implement the object to extract elements by subscript.
This is achieved by implementing the __getitem__
method of the object.
Let’s give one