Magic methods in python
1,__ del__ method
Destroy magic method
Trigger timing: automatically execute when an object is cleaned up in memory
Parameter: at least one self, receiving object
Return value: None
Function: do some operations during object cleaning
Note: the program calls this method automatically, and we don't need to call it manually.
class Person(object): def __init__(self): print('init') def __del__(self): print('Destroyed') person = Person() person1 = person print('The program is over')
Output is:
init The program is over Destroyed
As shown in the above code, when the program runs and there are no more referenced variables__ del__ Will take effect, so it's not when we call this object as we expected__ del__ It takes effect, so it will not be output
2,__ call__ method
call(): the function that is triggered when the object is bracketed
It further blurs the concept between function and object.
Usage: add parentheses after the object to trigger execution. That is, object () or class () ()
class Foo: def __init__(self): pass # When you add parentheses to an object, you can customize the function to trigger def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # Execute__ init__, The Foo memory address is assigned to obj obj() # The memory address in parentheses is called
Output is:
__call__
As shown in the above code, call__ call__ Foo is not required call. Because when obj=Foo(), the memory address of Foo() has been assigned to obj, obj itself represents the memory address when calling later, and obj() is used as a function
3,__ str__ method
Trigger timing: the function and method that the print object will trigger will be determined by itself
Parameter: a self receive object
Return value: must be of string type
Function: print (object time) to obtain string, which is usually used for shortcut operation
class People: school = 'SH' # 1. The function and method triggered by the print object will be customized # 2. The return value must be of string type def __str__(self): return self.school stu = People() print(stu)
Output is:
SH
stay python When using the print() function to output the object name in, by default, the memory address referenced by the object name will be printed. If you want to print the attribute value of the object, you can use the__ str__(self) this method.
4,__ new__ method
Instantiation magic method
Trigger timing: triggered when the pair is instantiated
Parameter: at least one cls receives the current class
Return value: an object instance must be returned
Working with: instancing objects
Note: the instantiated Object is the underlying implementation of the Object class, and other classes inherit the Object__ new__ To realize the instantiated Object.
Don't touch this magic method. Trigger it first__ new__ Will trigger__ init__
class Person(object): # initialization def __init__(self): print('init...') # Instantiation method (construction method) -- create object def __new__(cls, *args, **kwargs): print('new...') ret = super().__new__(cls) # Calling the parent class__ new__ The () method creates an object and receives the return value with return ret # Return object to person
Output is:
new... init... <__main__.Person object at 0x0000012173217B80>
As shown in the above code, an object must be created before initialization, so the output is new... Before init
5,getattr,setattr,__ delattr__ function
Getattr: object Property. When the property does not exist, it will be triggered automatically__ getattr__ method
Setattr: when assigning a value to a nonexistent attribute, it will be triggered automatically__ setattr__ method
Delattr: OK when deleting attributes, * * will be triggered automatically__ delattr__ method
class Foo: x = 1 def __init__(self, y): self.y = y # When a non-existent property is accessed, it will be triggered automatically def __getattr__(self, item): print('----> from getattr:The property you are looking for does not exist') def __setattr__(self, key, value): print('----> from setattr') # print(key) # print(value) # self.key = value # This is infinite recursion. Think about it self.__dict__[key] = value # It should be used def __delattr__(self, item): print('----> from delattr') # del self.item #Infinite recursion self.__dict__.pop(item) obj = Foo(10) obj.z = 10 print(obj.a) # Nonexistent property
Output is:
----> from setattr ----> from setattr ----> from getattr:The property you are looking for does not exist None