简介
魔法方法就如同它的名字一样神奇,总能在你需要的时候为你提供某种方法来让你的想法实现,这些方法在进行特定的操作时会自动被调用。魔法方法很大程度上让python在面向对象方面能发挥更大的作用,废话不多说,进入主题。
ShowMeCode
__doc__方法
class Person(object):
"""这是一个人的类"""
pass
print(f'Person.__doc__:{Person.__doc__}')
代码输出:Person.__doc__:这是一个人的类结论:__doc__表示类的描述信息
__module__方法
class Person(object):
"""这是一个人的类"""
pass
print(f'Person.__doc__:{Person.__doc__}')
代码输出:Person.__module__:__main__结论:__module__表示当前操作的对象在哪个模块
__init__方法
class Person(object):
"""这是一个人的类"""
def __init__(self):
print("__init__函数被调用")
tom = Person()
代码输出:__init__函数被调用结论:__init__在对象创建的时候自动调用
关于__init__函数我们一般这样用:
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("tom", '18')
print(tom.name, tom.age)
代码输出:tom 18
__call__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
def __call__(self):
print('对象加()就可以执行我')
tom = Person("tom", 18)
tom()
代码输出:对象加()就可以执行我结论:对象后面加括号,触发执行
__str__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"我叫{self.name},今年{self.age}."
tom = Person("tom", '18')
print(tom)
代码输出:我叫tom,今年18.结论:在打印对象时,默认输出该方法的返回值
如果去掉__str__方法呢?结果是输出类似<__main__.person object at>的十六进制内存地址,有兴趣可以自己试试
__class__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("tom", '18')
print(f'tom.__class__:{tom.__class__}')
代码输出:tom.__class__:结论:__class__方法表示当前操作的对象的类是什么
__dict__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("tom", '18')
print(f'tom.__dict__:{tom.__dict__}')
代码输出:tom.__dict__:{'name': 'tom', 'age': '18'}结论:__dict__方法已字典的形式输出类或对象中的所有属性
__del__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print(f'{self.name} is running.')
def __del__(self):
print(f'{self.name} runaway.')
tom = Person("tom", '18')
tom.run()
print('---')
代码输出:
tom is running.
---
tom runaway.结论:当对象在内存中被释放时,__del__方法自动触发执行
上述tom对象在程序结束之后,才被释放,这时候__del__方法被调用,如果手动释放tom呢?,我们看以下代码:
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print(f'{self.name} is running.')
def __del__(self):
print(f'{self.name} runaway.')
tom = Person("tom", '18')
tom.run()
del tom #手动释放对象print('---')
代码输出:
tom is running.
tom runaway.
---
我们发现__del__方法有点类似golang中的defer关键字,
但是两者作用域和触发条件都不同,defer在函数即将返回前才执行
__setitem__方法
class Person(object):
"""这是一个人的类"""
def __init__(self, name, age):
self.name = name
self.age = age
def __setitem__(self, key, value):
print(f'设置key和value会自动调用__setitem__:{key}=={value}')
def __getitem__(self, key):
print(f'设置key会自动调用__getitem__:{key}')
def __delitem__(self, key):
print(f'删除key会自动调用__delitem__:{key}')
tom = Person("tom", '18')
tom['hobby'] = 'running'
tom['hobby']
del tom['hobby']
代码输出:
设置key和value会自动调用__setitem__:hobby==running
设置key会自动调用__getitem__:hobby
删除key会自动调用__delitem__:hobby结论:
设置key和value会自动调用__setitem__方法
设置key会自动调用__getitem__方法
删除key会自动调用__delitem__方法