面向对象之内置方法
- 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
'''
标签:__,触发,name,之内,self,面向对象,init,print,方法
From: https://www.cnblogs.com/taoyuanshi/p/17994497