python有些类属性中,存在着一些具有特殊含义的属性
- __new__
__new__是在新式类中新出现的方法,它作用是在构造方法init()建造实例之前,控制是否创建对象,可用于单例模式
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意
可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
- __init__
初始化方法,通过类创建对象时,自动触发执行
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,
__init__不需要返回值
- __str__
当使用print输出对象的时候,默认打印对象的内存地址。
如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据
__str__方法通常返回一个字符串,作为这个对象的描述信息
- __del__
当删除对象时,python解释器会默认调用一个方法,这个方法为__del__()方法
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
当使用del() 删除变量指向的对象时,则会减少对象的引用计数。
如果对象的引用计数不为1,那么会让这个对象的引用计数减1,
当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
- __doc__
表示类的描述信息
- __class__
__class__ 表示当前操作的对象的类是什么
- __module__
__module__ 表示当前操作的对象在那个模块
- __call__
对象后面加括号,触发执行。
__init__方法的执行是由创建对象触发的,即:对象 = 类名();
而对于__call__方法的执行是由对象后加括号触发的,即:对象()或者 类( )( )
- __dict__
获取类或对象中的所有属性。
类的实例属性属于对象;类中的类属性和方法等属于类
print(类.__dict__)
输出:{ '__dict__' : <类属性、方法>, ...... }
print(实例对象.__dict__)
输出:{ 'name' : 'name1' , 实例对象的属性 ...... }- __getitem__ 、 __setitem__ 、 __delitem__
用于索引操作,如字典。
以上分别表示获取、设置、删除数据
举个黎姿:
# -*- coding:utf-8 -*-
class Foo(object):
def __getitem__(self, key):
print('__getitem__', key)
def __setitem__(self, key, value):
print('__setitem__', key, value)
def __delitem__(self, key):
print('__delitem__', key)
obj = Foo()
result = obj['k1'] # 自动触发执行 __getitem__
obj['k2'] = 'laowang' # 自动触发执行 __setitem__
del obj['k1'] # 自动触发执行 __delitem__
- __getslice__ 、 __setslice__ 、 __delslice__
该三个方法用于分片操作,如:列表
也举个黎姿:
# -*- coding:utf-8 -*-
class Foo(object):
def __getslice__(self, i, j):
print('__getslice__', i, j)
def __setslice__(self, i, j, sequence):
print('__setslice__', i, j)
def __delslice__(self, i, j):
print('__delslice__', i, j)
obj = Foo()
obj[-1:1] # 自动触发执行 __getslice__
obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__
del obj[0:2] # 自动触发执行 __delslice__
小楼昨夜又东风