Python进阶之内置方法

【一】内置方法引入

__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
posted @ 2024-05-10 18:46  Ligo6  阅读(48)  评论(0)    收藏  举报