第四天(python打卡)

面向對象編程:將變量或函數變私有(在名字前加兩個下劃線)

    繼承(支持多重繼承):子類 <---- 基類,父類或超類(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章