面向对象之内置方法

面向对象之内置方法

  • Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类
  • 这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发
__init__	:初始化类时触发
__del__		:删除类时触发
__new__		:构造类时触发
__str__		:str函数或者print函数触发
__repr__	:repr或者交互式解释器触发
__doc__		:打印类内的注释内容
__enter__	:打开文档触发
__exit__	:关闭文档触发
__getattr__ : 访问不存在的属性时调用
__setattr__ :设置实例对象的一个新的属性时调用
__delattr__ :删除一个实例对象的属性时调用
__setitem__	:列表添加值
__getitem__ :将对象当作list使用 
__delitem__	:列表删除值
__call__	:对象后面加括号,触发执行
__iter__	:迭代器

一、__init__()__del__()__new__()

  • Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类

  • 这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发

  • __new__提供框架最先触发,__init__提供类的内容接着触发,__del__在程序结束删除类时被触发

class Person(object):
    def __init__(self):
        print('__init__被触发了!')

    def __new__(cls, *args, **kwargs):
        print('__new__被触发了!')
        return super().__new__(cls, *args, **kwargs)

    def __del__(self):
        print('__del__被触发了!')


people = Person()
print("1", end='  ')
print("2", end='  ')
print("3")
'''
__new__被触发了!
__init__被触发了!
1  2  3
__del__被触发了!
'''

二、__str____repr__

[1]__str__(打印时被触发)

  • print功能打印的就是它的返回值
  • 我们通常基于方法来定制对象的打印信息
  • 该方法必须返回字符串类型
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        print('__srt__被触发了!')
        return f'my name is {self.name},i am {self.age} years old'


people = Person('Xanadu', 22)
print(people)
'''
__srt__被触发了!
my name is Xanadu,i am 22 years old
'''

[2]__repr__

  • repr或者交互式解释器触发
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        print('__repr__被触发了!')
        return f'my name is {self.name},i am {self.age} years old'


people = Person('Xanadu', 22)
# __repr__的触发需要在打印时使用repr()或者交互式解释器触发
print(repr(people))
'''
__repr__被触发了!
my name is Xanadu,i am 22 years old
'''
  • 如果__str__没有被定义,那么就会使用__repr__来代替输出

isinstance(obj,cls)issubclass(sub,super)

四、__doc__

class Person(object):
    '文本描述'
    ...


people = Person()
print(people.__doc__)  # 文本描述

__setattr__,__delattr__,__getattr__

  • __getattr__(self, name): 访问不存在的属性时调用
  • __setattr__(self, name, value):设置实例对象的一个新的属性时调用
  • __delattr__(self, name):删除一个实例对象的属性时调用
class Person(object):
    def __init__(self, name):
        print('触发了 init 方法')
        self.name = name

    def __getattr__(self, item):
        print(f'触发了 getattr 方法')

    # 在类中定义了__setattr__后,必须要执行必要代码,否则实例化出的对象名称空间中的变量都会清零
    def __setattr__(self, key, value):
        print('触发了setattr方法')
        self.__dict__[key] = value


people = Person('Xanadu')
'''
触发了 init 方法
触发了setattr方法
'''
print(people.name)  # Xanadu
print(people.__dict__)  # {'name': 'Xanadu'}

六、__call__

  • 对象后面加括号,触发执行。
  • 注:构造方法的执行是由创建对象触发的
    • 即:对象 = 类名() ;
  • 而对于 __call__ 方法的执行是由对象后加括号触发的
    • 即:对象() 或者 类()
class Person(object):
    def __init__(self, name, age):
        print('__init__被触发了!')
        self.name = name
        self.age = age

    def __call__(self, *args, **kwargs):
        print('__call__被触发了!')
        print(f'name : {self.name}, age : {self.age}')


people = Person('Xanadu', 22)
people()
'''
__init__被触发了!
__call__被触发了!
name : Xanadu, age : 22
'''
posted @ 2024-01-29 14:47  桃源氏  阅读(23)  评论(0)    收藏  举报