python的数据对象常用法法以及双下方法总结
1 列表和元祖的方法和属性,不包含object类支持的方法
列表 | 元祖 | ||
s1.__add__(s2) | y | y | s1+s2 拼接 |
s1.__iadd__(s2) | y | s1+=s2 就地拼接 | |
s.append(e) | y | 尾部追加元素 | |
s1.clear() | y | 清除所有元素 | |
s1.__contains__(e) | y | y | s1是否包含e |
s.copy() | y | 列表浅copy | |
s.count(e) | y | y | e在s中的次数统计 |
s.__delitem__(p) | y | 把s中索引位置为p的元素删掉 | |
s.extend(it) | y | 把可迭代对象it追加给s | |
s.__getitem__(p) | y | y | s[p],获取s中索引位置为p的元素 |
s.__getnewargs__() | y | 在pickle中支持更加优化的序列化 | |
s.index(e) | y | y | 在s中找到元素第一次出现的索引位置 |
s.insert(p,e) | y | 把元素e插入到p的索引位置 | |
s.__iter__() | y | y | 返回s的迭代器 |
s.__len__() | y | y | len(s) 元素的数量 |
s.__mul__() | y | y | s*=n,n个s的重复拼接 |
s.__imul__(n) | y | s*=n,就地拼接 | |
s.__rmul__(n) | y | y | 反向拼接 |
s.pop(p) | y | 默认删除最后一个值,或者指定的p索引位置的值,并且有返回值 | |
s.remove(e) | y | 删除s中第一次出现的e元素 | |
s.reverse() | y | 就地把s内的元素倒序排序,元祖虽然没有这个方法,但是reverse(tuple) | |
s.__reversed__() | y | 返回s的倒序迭代器 | |
s.__setitem__(p,e) | y | s[p]=e,赋值 | |
s.sort([key],[reverse]) | y | 就地对s中水元素进行排序,可迭代的参数有key和reverse |
2 dict collections.defaultdict collections.orderdict这三种映射类型的方法列表,不包含object常见方法
dict | defaultdict | orderdict | 备注 | |
d.clear() | y | y | y | 删除所有元素 |
d.__contains__() | y | y | y | 检查k是否在d中 |
d.copy() | y | y | y | 字典浅拷贝 |
d.__copy__() | y | 用于支持copy.copy | ||
d.default.factory | y | 在__missing__函数中被调用的函数,用于给未找到的元素设置值 | ||
d.__delitem__(k) | y | y | y | 将迭代器it里的元素设置为映射里的键 |
d.fromkeys(it,[initial]) | y | y | y | 如果有inital参数,就把它作为这些键对应的值(默认为None) |
d.get(k,default) | y | y | y | 返回字典中k对应的值,如果没有就返回defalut |
d.__getitem__(k) | y | y | y | 让字典d能以d[k]对应的值 |
d.items() | y | y | y | 返回字典中所有的键值对 |
d.__iter__() | y | y | y | 返回键的迭代器 |
d.keys() | y | y | y | 返回字典中所有的键 |
d.__len__() | y | y | y | 返回字典中所有的减值 |
d.__miss__(k) | y | 当__getitem__()方法无法找到值得时候,该方法会调用 | ||
d.move_to_end(k,[last]) | y | 把键为k的元素移动到字典的最前或最后,last默认为true | ||
d.pop(k,[defalut]) | y | y | y | 删除元素,如果找不到这个k那么返回None或defalut |
d.popitem() | y | y | y | 随机返回一个减值对并且删除它 |
d.__reversed__() | y | y | y | 返回倒序的键的迭代器 |
d.setdefault(k,[default]) | y | y | y | 如果字典中有k,则返回k对应的v,如果没有则d[k]=defalut,并且返回defalut |
d.__setitem__(k,v) | y | y | y | 实现d[k]=v,赋值 |
d.update(m,[**kwargs]) | y | y | y | 更新,如果字典中存在k重复则更新,如果没有就追加 |
d.values() | y | y | y | 返回字典中所有的值 |
__missing__()特殊方法,所有的映射类型在处理找不到的键的时候,都会牵扯到__missing__()。基类中dict并没有定义这个方法,但是dict是知道这个这个方法的存在的,如果一个类继承了dict,然后这个继承类提供了__missing__()方法,那么在__getitem__()找不到值得时候,就会python解释器就会自动调用__missing__()
class str_key_dict(dict): def __missing__(self, key): if isinstance(key,str): raise KeyError(key) return self[str(key)] def get(self,key,default=None): try: return self[key] except KeyError: return default def __contains__(self, key): return key in self.keys() or str(key) in self.keys()
3 其他内置双下方法:
__len__ | 返回长度,必须返回int类型的返回值 |
__str__ | print str时触发,需要有一个字符串类型的返回值,如果__str__和__repr__同时存在,则先调用__str__ |
__repr__ |
repr触发,同__str__一样,但是信息更加详细,只是str更适合阅读,repr返回的信息更加精准,可以显式的使用!r或repr执行调用 __repr__ |
__init__ | 类的实例化 初始化方法 |
__new__ | 创建一个对象,类在实例化时,默认执行object的__new__方法,用于构建self |
__hash__ | 调用hash()方法判断是否可以被hash时触发,set就依赖__hash__和__eq__,set的实现,依赖对象hash eq方法先调用hash,拿到hash值在调用eq |
__call__ | 对象或者方法后加括号调用时触发 |
__eq__ | 判断2个值是否相等 |
__del__ | 析构函数,del触发,在删除一个对象之前进行一些收尾工作 |
__delitem__ | 支持字典的删除,查看字典源码,也是这样写的,包含列表 |
__name__ | 类的名字 |
__doc__ | 类的文档字符串(注释) |
__base__ | 类的第一个父类 |
__bases__ | 类的所有父类 |
__dict__ | 类的字典属性 |
__module__ | 类定义所在的模块 |
__class__ | 实例对应的类 |
单例模式
__new__ 单例模式 # 一个类始终只有一个实例 限制一个类从头到尾只有一个实例 # 当你之后再来实例化的时候看就用之前创建的对象 # class b: # __insta=False # def __init__(self,name,age): # self.name=name # self.age=age # def __new__(cls, *args, **kwargs): # ''' # 在外部实例化该类的时候,回执行类中的双下new方法 # 通过判断_insta的真假,返回不同的返回值,在第一次 # 实例化该类的时候,其实通过在类的内部改变了私有__insta的方法 # 当下次再实例化调用时,就返回已经变更过的私有__insta方法 # # ''' # if cls.__insta: # return cls.__insta # cls.__insta=object.__new__(b) # return cls.__insta # egon=b('agg',38) # nezha=b('nazha',25) # print(nezha) # print(egon) # print(nezha.name) # print(egon.name)
python中垃圾回收机制
1 引用计数:
cpython中,垃圾回收使用的主要算法是引用计数,实际上每个对象都会统计有多少应用指向自己,当引用计数归0,对象就销毁了:cpython会在对象上调用__del__方法(如果定义了),然后释放分配给对象的内存,但是需要注意的是有时候即使引用计数归零,cpython也不会立即调用__del__()方法,比如一组对象之间全部是相互应用,那么即使在牛逼的引用方式也会导致组中的对象不可以获取,当然python另外有更加复杂的垃圾回收程序来处理这样的事情
2 标记清除
3 分代回收