python定义函数以什么开头,python中!=表示什么
Python中有很多以_ _开头的变量。这些变量意味着什么?[__dir__,__slots__,__weakref__,__missing__,__contains__]在此介绍。
__dir__-Just看一个小例子。
In[1]:classT(对象):
.通行证
.
In[2]:t=T()
在[3]:t。Tab什么都没有。
在[4]:classT2(对象):
.def__dir__(self):
.return[a , b]
.
[5]:t=T2()
在[6]:t。
t.at.b
在[7]:迪尔(吨)
Out[7]:[a , b]我看到了,但是我不解释,但是这个__dir__相对于类的实例是有效的。
__slots__
这个在我刚学python的时候很模糊。最初的理解是它的出现取代了__dict__,也就是说你只能给变量列表项_ _ slots的属性赋值。外部接口减少,安全。后来我看了这个用Python的槽节省9gb RAM。很久没做运维了。生产环境是怎样的,我无法下结论。还提到在对象实例很多的情况下可以帮助减少内存。详见https://www . safaribookonline.com/library/view/python-cookbook-3rd/9781449357337/ch08s 04 . html这里有个小实验(https://news.ycombinator.com/item?也在黑客新闻id=6750187中讨论过)
例子(我评论细节):
#编码=utf-8
importsys
fromitertoolsimportstarmap,产品
classSlotTest(对象):
#__slots__=[x , y , z]主要比较去掉这句话和包含这句话的内存占用情况。
def__init__(self,x,y,z):
self.x=x
self.y=y
self.z=z
def__str__(self):
n
bsp;return"{}{}{}".format(self.x,self.y,self.z)
p=product(range(10000),range(20),[4])#创建0-1000&0-20&4的笛卡尔积
a=list(starmap(SlotTest,p))#相当于对每个SlotTest实例化,实例化的格式是p的长度
printa[0]
sys.stdin.read(1)结果对比:
$pmap-x`ps-efgreptest_slot.pygrep-vgrepawk'{print$2}'`greptotal#未使用__slots__结果很明显,内存占用减少了很多...totalkB1034967648073728
$pmap-x`ps-efgreptest_slot.pygrep-vgrepawk'{print$2}'`greptotal#使用了__slots__
totalkB499602288820136
__weakref__ 弱引用
首先先说下weakref: 弱引用,与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收. 在Python中,当一个对象的引用数目为0的时候,才会被从内存中回收. 但是被循环引用呢?
In[1]:importweakref好吧, 我的总结是弱引用是个好东西, 但是加了__slots__就不支持弱引用了. 所以需要__weakref__In[2]:importgc
In[3]:classObj(object):
...:defa(self):
...:return1
...:
In[4]:obj=Obj()
In[5]:s=obj
In[6]:gc.collect()#不可达引用对象的数量
Out[6]:3
In[7]:printsisobj
True
In[8]:obj=1#最初的被引用的对象改变了.
In[9]:gc.collect()
Out[9]:0
In[10]:sisNone#s还是指向了Obj引用计数为1
Out[10]:False
In[11]:s
Out[11]:<__main__.Objat0x2b36510>
----华丽的分割一下
In[12]:obj=Obj()
In[13]:r=weakref.ref(obj)#让obj变成那个弱引用
In[14]:gc.collect()
Out[14]:211
In[15]:r()isobj
True
In[16]:obj=1
In[17]:gc.collect()
Out[17]:0
In[18]:r()isNone#弱引用计数器没有增加,所以当obj不在引用Obj的时候,Obj对象就被释放了
Out[18]:True
In[9]:classT3(object):__contains__ 判断某值 in/not in 实例...:__slots__=[]
...:
In[10]:classT4(object):
....:__slots__='__weakref__'#这样就支持了weakref
....:
In[11]:importweakref
In[12]:t3=T3()
In[13]:t4=T4()
In[14]:weakref.ref(t3)
---------------------------------------------------------------------------
TypeErrorTraceback(mostrecentcalllast)
<ipython-input-14-bdb7ab7ac3bc>in<module>()
---->1weakref.ref(t3)
TypeError:cannotcreateweakreferenceto'T3'object
In[15]:weakref.ref(t4)
Out[15]:<weakrefat0x2766f70;to'T4'at0x2586fd8>
In[1]:classNewList(object):最初看这个特殊方法是看python标准库的源码的时候(collections#L421):...:def__init(self,values):
...:self.values=values
...:def__contains__(self,value):
...:returnvalueinself.values
...:
In[2]:l=NewList([1,2,3,4])
In[3]:4inl
Out[3]:True
In[4]:10inl
Out[4]:False
__missing__
classCounter(dict):什么意思呢?...
def__missing__(self,key):
'ThecountofelementsnotintheCounteriszero.'
#Neededsothatself[missing_item]doesnotraiseKeyError
return0
In[6]:c=collections.Counter({'a':1})In[7]:c['b']#没有键的count设置默认值0
Out[7]:0
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。