【一】内置方法引入
__init__ :初始化对象时触发
__del__ :删除类时触发
__new__ :构造类时触发
__str__ :str函数或者print函数触发
__repr__ :repr或者交互式解释器触发
__doc__ :打印类内的注释内容
__enter__ :打开文档触发
__exit__ :关闭文档触发
__getattr__ : 访问不存在的属性时调用
__setattr__ :设置实例对象的一个新的属性时调用
__delattr__ :删除一个实例对象的属性时调用
__setitem__ :列表添加值
__getitem__ :将对象当作list使用
__delitem__ :列表删除值
__call__ :对象后面加括号,触发执行
__iter__ :迭代器
【二】内置方法使用
【1】__init__
,__del__
,__new__
__init__
: 实例化类得到对象的时候会自动触发
class Student(object):
def __init__(self, name):
print(f"实例化类的时候触发")
self.name = name
student = Student('ligo')
print(student.name)
# 实例化类的时候触发
# ligo
__del__
: 当对象/对象关闭销毁的时候自动触发
class Student(object):
def __init__(self, name):
print(f"实例化对象的时候触发")
self.name = name
def __del__(self):
print(f"在销毁的时候触发")
student = Student('ligo')
print(student.name)
# 实例化类的时候触发
# ligo
# 当前在销毁的时候触发
__new__()
方法
class Student(object):
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls)
obj.__init__(*args, **kwargs)
print(f'{obj.name} is reading')
return obj
student = Student('ligo')
# ligo is reading
【2】__str__
,__repr__
__str__
方法会在被执行打印操作的时候会自动触发,该方法必须返回字符串类型
class Student(object):
def __init__(self, name):
print(f"在实例化对象的时候触发")
self.name = name
def __str__(self):
print(f"在打印对象的时候触发")
return f'学生姓名:{self.name}'
student = Student('ligo')
# 在实例化对象的时候触发
# 在打印对象的时候触发
print(student) # 打印返回值
# 学生姓名:ligo
__repr__
方法在交互解释器触发,返回值必须是字符串类型
class Student(object):
def __init__(self, name):
print(f"在实例化对象的时候触发")
self.name = name
def __repr__(self):
print(f"在交互解释器的时候触发")
return f'学生姓名:{self.name}'
student = Student('ligo')
# 在实例化对象的时候触发
# 在交互解释器的时候触发
print(student) # 打印返回值
# 学生姓名:ligo
【3】__doc__
__doc__
方法在打印类里面的注释内容的时候会触发
class Student:
__doc__ = "这是一个学生类"
pass
print(Student.__doc__)
# 这是一个学生类
【4】__enter__
和__exit__
- 使用with语句执行代码块时,先执行
__enter__
方法,然后执行代码块,再执行__exit__
方法
class Context(object):
def __init__(self, data):
self.data = data
def __enter__(self):
print(f'当被with语句打开时触发: {self.data}')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print(f'当with语句执行结束后触发: {self.data}')
with Context('Hello World') as fp:
print(fp.data)
# 当被with语句打开时触发: Hello World
# Hello World
# 当with语句执行结束后触发: Hello World
【5】__setattr__
,__delattr__
,__getattr__
__getattr__(self, item)
: 对象在查找不存在的属性时自动触发__setattr__(self, key, value)
:对象在设置新的属性时自动触发__delattr__(self, key)
:删除实例对象的属性时自动触发
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 获取值
def __getattr__(self, item):
print('在查找不存在属性的时候触发')
def __setattr__(self, key, value):
print('在设置属性的时候触发')
super().__setattr__(key, value)
def __delattr__(self, key):
print('在删除属性的时候触发')
self.__dict__.pop(key)
stu = Student('ligo', 18)
# 在设置属性的时候触发
# 在设置属性的时候触发
# 获取不存在属性
print(stu.sex)
# 在查找不存在属性的时候触发
# None
# 设置属性
stu.age = 20
print(stu.age)
# 在设置属性的时候触发
# 20
# 删除属性
del stu.name
print(stu.name)
# 在删除属性的时候触发
【6】__setitem__
,__getitem__
,__delitem__
__setitem__
对象[key]=value 设置值的时候会触发__getitem__
获取属性的时候会触发 设置方式为 对象[key]__delitem__
删除属性的时候会触发 删除方式为 del 对象[key]
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 获取值
def __getitem__(self, item):
print('在获取属性的时候触发')
# 对象本身是没有 属性值 = obj[属性名] 这个方法的,通过__getitem__就可以
print(self.__dict__[item])
def __setitem__(self, key, value):
print('在设置属性的时候触发')
# 向自己的名称空间字典中增加新的属性
self.__dict__[key] = value
def __delitem__(self, key):
print('在删除属性的时候触发')
# 对象本身是没有 del obj[属性名] 这个方法的,通过 __delitem__ 就可以
self.__dict__.pop(key)
stu = Student('ligo', 18)
# 获取属性
print(stu['name'])
# 在获取属性的时候触发
# ligo
# 设置属性
stu['sex'] = '男'
print(stu.sex)
# 在设置属性的时候触发
# 男
# 删除属性
del stu['name']
print(stu.name)
# 在删除属性的时候触发
# AttributeError: 'Student' object has no attribute 'name'
【7】__call__
- 当对象调用函数(obj())时自动触发
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __call__(self):
print(f'{self.age}岁的小伙{self.name}')
stu = Student('ligo', 18)
print(stu())
# 18岁的小伙ligo
标签:__,触发,进阶,之内,Python,self,print,def,name
From: https://www.cnblogs.com/ligo6/p/18183505