一堆內建函式

2021-08-22 04:58:03 字數 3781 閱讀 8565

__del__       當刪除乙個物件時,python直譯器也會預設呼叫乙個方法,這個方法為__del__()方法

__call__      乙個物件加乙個小括號可以執行該類下面的__call__方法

__doc__      無法被繼承

__module__表示當前操作的物件在哪個模組

__class__    表示當前操作的物件的類是什麼

instance和ssubcclass:

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 函...