面向對象編程:將變量或函數變私有(在名字前加兩個下劃線)
繼承(支持多重繼承):子類 <---- 基類,父類或超類(PS:如果在子類中定義與父類同名的方法或屬性,則會自動覆蓋父類對應的方法或屬性)
重寫__init__()方法:
-調用未綁定的父類方法
-使用super 函數
組合
class Turtle:
def __init__(self,x):
self.num = x
class Fish:
def __init__(self,x):
self.num = x
class Pool:
def __init__(self,x,y):
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print('水池裏總共有烏龜%d 只,小魚%d 條' % (self.turtle.num,self.fish.num))
綁定:Python嚴格要求方法需要有實例才能被調用。
一些相關的BIF: issubclass(class,classinfo) , isinstance(object,classinfo) , hasattr() , getattr() , setattr() , delattr()
構造和析構:魔法方法總是被下劃線包圍,總能夠在適當的時候被自動調用
第一個被調用的:__new__(cls[,...])
del x !=x.__del__() (在垃圾回收機制時被觸發)
屬性訪問:
__getattr__ (試圖訪問不存在的屬性時), __getattribute__ (屬性被訪問時), __setattr__ , __delattr__
描述符:將某種特殊類型的類的實例指派給另一個類的屬性(實現__get__, __set__, __delete__)
>>> class MyDecriptor:
def __get__(self,instance,owner):
print("getting...",self,instance,owner)
def __set__(self,instance,owner):
print("setting...",self,instance,owner)
def __delete__(self,instance):
print("deleting...",self,instance)
>>> class Test:
x = MyDecriptor()
>>> test = Test()
>>> test.x
實現攝氏度和華氏度之間的轉換:
class Celsius: def __init__(self,value=26.0): self.value = float(value) def __get__(self,instance,owner): return self.value def __set__(self,instance,value): self.value = float(value) class FaHrenheit: def __get__(self,instance,owner): return instance.cel*1.8+32 def __set__(self,instance,value): instance.cel = (float(value) - 32)/1.8 class Temperature: cel = Celsius() fah = FaHrenheit()
定製容器:
協議:相似於其他語言中的接口,但更像是一種指南。
不可變:__len()__ , __getitem__()
class Countlist():
def __init__(self,*args):
self.values = [i for i in args]
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self.values)
def __getitem__(self,key):
self.count[key]+=1
return self.values[key]
可變:加上 __setitem__() , __delitem__()
迭代器(字典,序列):iter() --> __iter__() return self 使用在容器上就可使之成爲迭代器, next() --> __next__() 定義迭代規則
for循環:
>>> string = 'haala'
>>> it = iter(string)
>>> while True:
try:
each = next(it)
except StopIteration:
break
print(each)
>>> for each in string:
print(each)
>>> class Fibs:
def __init__(self,n=20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a,self.b = self.b,self.a+self.b
if self.a > self.n:
raise StopIteration
return self.a
>>> fibs = Fibs()
>>> for each in fibs:
print(each)