python定义函数以什么开头,python中!=表示什么

  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

  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

好吧, 我的总结是弱引用是个好东西, 但是加了__slots__就不支持弱引用了. 所以需要__weakref__

  

In[9]:classT3(object):

  ...:__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>

__contains__ 判断某值 in/not in 实例

  

In[1]:classNewList(object):

  ...: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__

最初看这个特殊方法是看python标准库的源码的时候(collections#L421):

  

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: