1. 程式人生 > >Python學習-第六章 抽象

Python學習-第六章 抽象

抽象

內建函式callable可以判斷某個物件是否可呼叫

>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
False
>>> callable(y)
True

定義函式用def:

>>> def fibs(num):
...    result=[0,1]
...    for i in range(num-2):
...       result.append(result[-2]+result[-1])
...    return result
...
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

要給函式編寫文件,以確保其他人能夠理解,可添加註釋(以#打頭的內容)。還有另一種編寫註釋的方式,就是新增獨立的字串。放在函式開頭的字串稱為文件字串,將作為函式的一部分儲存起來。
函式vars返回看不見的字典,一般而言不應修改vars返回的字典。
多型:可對不同型別的物件執行相同的操作。不同物件對同一方法響應不同的行動。
封裝:對外部隱藏有關物件工作原理的細節。
繼承:可基於通用類創建出專用類。
多型讓你無需知道物件所屬的類(物件的型別)就能呼叫其方法,而封裝讓你無需知道物件的構造就能使用它。
多型的舉例:

class A:
    def fun(self):
        print("我是小A。。。。。")

class B:
    def fun(self):
        print("我是小B。。。。。")
使用了多型但沒有使用封裝的示例
>>> class OpenObject:
...    def set_name(self,name):
...       self.name=name
...    def get_name(self):      #self是指向物件本身
...       return self.name
...
>>> o=OpenObject()
>>> o.set_name('Sir Lancelot')
>>> o.get_name()
'Sir Lancelot'

在Python3以前的版本中建立類要加上_metaclass_=type


要指定超類,可在class語句中的類名後加上超類名,並將其用圓括號括起。

>>> class Filter:
...    def init(self):
...       self.blocked=[]
...    def filter(self,sequence):
...       return [x for x in sequence if x not in self.blocked]
...
>>> class SPAMFilter(Filter):
...    def init(self):
...       self.blocked=['SPAM']
...
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=SPAMFilter()
>>> s.init()
>>> s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
['eggs', 'bacon']

內建方法issubclass可以確定一個類是否是另一個類的子類。

>>> class Calculator:
...    def calculate(self,expression):
...       self.value=eval(expression)
...
>>> class Talker:
...    def talk(self):
...       print('Hi,my value is',self.value)
...
>>> class TalkingCalculator(Calculator,Talker):
...    pass
...
>>> tc=TalkingCalculator()
>>> tc.calculate('1+2*3')
>>> tc.talk()
Hi,my value is 7

這被稱為多重繼承,使用多重繼承時,注意:如果多個超類以不同的方式實現了同一方法(即有多個同名方法),必須在class語句中小心排列這些超類,因為位於前面的類的方法將覆蓋位於後面的類的方法。
多個超類的超類相同時,查詢特定方法或屬性時訪問超類的順序稱為方法解析順序。
用hasttr可以檢查所需的方法是否存在。

>>> hasattr(tc,'talk')
True
>>> hasattr(tc,'fnord')
False

可以使用@abstractmethod來將方法標記為抽象的-在子類中必須實現的方法