__del__ 當刪除乙個物件時,python直譯器也會預設呼叫乙個方法,這個方法為__del__instance和ssubcclass:()
方法__call__ 乙個物件加乙個小括號可以執行該類下面的__call__方法
__doc__ 無法被繼承
__module__表示當前操作的物件在哪個模組
__class__ 表示當前操作的物件的類是什麼
class foo:
pass
f1=foo()
a=isinstance(f1,foo)#判斷f1是否是foo的派生的例項,返回乙個布林值
print(a)
class fzz(foo):
pass
f2=fzz()
b=issubclass(fzz,foo)#判斷fzz是否是foo的子類,返回乙個布林值
c=isinstance(f2,fzz)#判斷f2是否是fzz的派生的例項,返回乙個布林值
d=isinstance(f2,foo)#判斷f2是否是foo的派生的例項(祖鋪關係),返回乙個布林值
print(b)
print(c)
print(d)
item:
class foo:
def __setitem__(self, key, value):
print('__setitem__')
def __getitem__(self, item):
print('__getitem__')
def __delitem__(self, key):
print('__delitem__')
f1=foo()
f1['name']='lee'
f1['name']
del f1['name']
#以字典的形式賦值操作會觸發item,.點的方式觸發attr
__str__和__repr__:
l1=list('rewrew')
print(l1)
class foo:
def __init__(self):
pass
def __repr__(self):
return '直譯器會觸發__repr__'
l2=foo()
print(l2) #print觸發的是__str__方法,如果找不到會觸發__repr__
a=l2
#print觸發的是__str__方法,如果找不到會觸發__repr__,直譯器會觸發__repr__:
自製format格式化:
format_dict=',
'y-m-d':'--',
'y:m:d':'::'
}class date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day
def __format__(self, format_spec):
fm=format_dict[format_spec]
print(self)
return fm.format(self)
a=date('2012','11','20')
b=format(a,'y-m-d')#觸發__format__
print(b)
__slots__:
class foo:
__slots__ = ['name','id']#__slots__指定例項的屬性,例項不會再有字典self.__dict__
a=foo()
a.name=10
b=foo()
b.name=122
#a.b=15
print(a.name)
print(b.name)
print(a.__slots__)
print(foo.__slots__)
#print(a.__dict__)例項不會再有字典self.__dict__
print(foo.__dict__)
迭代器協議:斐波那契數列
class foo:
def __init__(self):
self.a=1
self.b=1
def __iter__(self):#迭代器先出發__iter__再觸發__next__,for迴圈遵循迭代器協議,遇到raise stopiteration跳出迴圈,迭代器只會儲存乙個值,迴圈就被替換
return self
def __next__(self):
if self.a>12:
raise stopiteration('終止了')
self.a,self.b=self.b,self.a+self.b
return self.a
c=foo()
for i in c:
print(i)
#迭代器先出發__iter__再觸發__next__,for迴圈遵循迭代器協議,遇到raise stopiteration跳出迴圈,迭代器只會儲存乙個值,迴圈就被替換
描述符優先順序:
class foo:
def __get__(self, instance, owner):
print('get')
def __set__(self, instance, value):
print('set',instance, value)
instance.__dict__['x']=value #因為描述符優先例項屬性,b1例項化觸發__set__方法,在set方法裡面設定b1例項字典中key的值
def __delete__(self, instance):
print('delete')
class bar:
x=foo() #bar的例項對x的呼叫全部都會去找foo包含的方法,即例項屬性低於資料描述符
def __init__(self,n):
self.x=n
return self.x
b1=bar(10)
print(b1.x)
del b1.x
#print(b1.__dict__)
#資料描述符:至少實現了__get__(),__set__()
#類屬性》資料描述符》例項屬性》非資料描述符》找不到的屬性觸發__getattr__()
#類屬性》資料描述符》例項屬性》非資料描述符》找不到的屬性觸發__getattr__() 一堆一堆又一堆 合併果子
題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗...
送你一堆區間
按區間貪心做慣了,遇到按區間dp就傻了。實際上應該按關鍵點dp,這樣計數才更加方便。至於線段樹優化,直接把dp陣列看做線段樹是不是太。accode include include include include define maxn 500005 define mod 1000000009 def...
演算法題一堆
演算法題 說明 這些題就不是什麼花樣了,考的是你的基礎知識怎麼樣。再聰明而沒有實學的人都將會被這些題所淘汰。1.鍊錶和陣列的區別在 2.編寫實現鍊錶排序的一種演算法。說明為什麼你會選擇用這樣的方法?3.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?4.請編寫能直接實現strstr 函...