Python學習進階教程(6)—內置函數(之六)

(本號正在連續推出以Python官網文檔為主線的完整的系統的學習Python的系列文章和視頻,感興趣的朋友們歡迎搜索關注。本文及後續文章如無特別聲明均以Windows平臺作為演示平臺,Python版本為:3.8.1)


【注意:開始學習“Python學習進階教程”系列內容前須已經學習過“Python學習入門教程”系列內容】


class set([iterable])

返回一個包含iterable中的元素的新的set對象, set是一個內置類。參數iterable是可選的,如果沒提供iterable,則返回空set。[關於set的具體用法在"Python學習入門(12)—集合"中已有詳細介紹]

setattr(object, name, value)

這是與getattr()對應的操作。參數是一個對象、一個字符串和一個任意值。字符串可以命名現有屬性或新屬性。如果對象允許,函數將該值賦給屬性。例如,setattr(x, 'foobar',123)等於x.foobar = 123。

class slice(stop)

class slice(start, stop[, step])

返回一個切片對象,它表示由範圍(start, stop, step)指定的一組索引。start和step參數默認為None。切片對象具有隻讀的數據屬性start、stop和step,它們僅返回參數值(或其默認值),沒有其他明確的功能,不過Numerical Python和其他第三方擴展在使用它們。使用擴展索引語法時也會生成切片對象。例如:a[start:stop:step]或a[start:stop, i]。

sorted(iterable, *, key=None, reverse=False)

返回一個以iterable中的元素為元素的排序後的新列表。有兩個可選參數,它們必須作為關鍵字參數來使用。key指定具有一個參數的函數,用於從iterable中的每個元素中提取一個比較鍵(例如,key=str.lower)。默認值是None(直接比較元素)。reverse是一個布爾值,如果設置為True,那麼列表元素將按照每次比較的逆序進行排序。對於舊式的cmp函數可使用functools.cmp_to_key()將其轉換成鍵函數。該函數保證排序是穩定的。如果排序是穩定的,則保證在排序過程中不改變相等的元素的相對順序,這有助於進行多關鍵字排序(例如,按部門排序,然後按工資等級排序)。

@staticmethod

將方法轉換為靜態方法。靜態方法不接收隱式的第一個參數。要聲明一個靜態方法,使用如下形式:

<code>class C:
    @staticmethod
    def f(arg1, arg2, ...):
.../<code>

@staticmethod是一個函數裝飾器

靜態方法可以在類(如C.f())上調用,也可以在實例(如C().f())上調用。Python中的靜態方法類似於Java或C++中的靜態方法。瞭解用於創建可替代的類構造函數請參閱classmethod()。

與所有裝飾器一樣,也可以將staticmethod作為常規函數調用,並對它的結果進行操作。在某些情況下,需要從類主體引用一個函數,並且希望避免其自動轉換為實例方法時,需要這樣做。對於這些情況,可以使用如下形式:

<code>class C:
    builtin_open = staticmethod(open)/<code>

class str(object='')

class str(object=b'', encoding='utf-8', errors='strict')

返回object的字符串版本。如果沒有提供object,則返回空字符串。str()的行為取決於給定的是encoding 還是 errors。如果既沒有給出encoding,也沒有給出errors,則str(object)返回object.__str__(),這是對象的“非正式”或可打印的字符串表示形式。對於string對象,就是字符串本身。如果對象沒有一個__str__()方法,那麼str()將返回repr(對象)。如果給定了encoding或errors至少一個,則對象應該是類似於bytes的對象(例如bytes或bytearray)。在本例中,如果對象是一個bytes(或bytearray)對象,那麼str(bytes, encoding, errors)就相當於byte .decode(encoding, errors)。否則,在調用bytes.decode()之前,將獲得緩衝區對象中的bytes對象。在沒有encoding或errors參數的情況下將一個字節對象傳遞給str()屬於第一種返回非正式字符串表示的情況(請參閱Python的-b命令行選項)。例如:

<code>>>> str(b'Zoot!')
"b'Zoot!'"/<code>

sum(iterable, /, start=0)

對start和iterable中的元素從左到右求和,並返回總數。iterable的元素通常是數字,start不允許是字符串。

對於某些用例,sum()有很好的替代方法。連接字符串序列的首選快速方法是調用''.join(sequence)。若要添加具有擴展精度的浮點值,請參見math.fsum()。要連接一系列可迭代對象,可以考慮使用itertools.chain()。

super([type[, object-or-type]])

返回一個代理對象,該對象將方法調用委託給type的父類或兄弟類。這對於訪問在類中被覆蓋的繼承方法非常有用。

object-or-type決定要搜索的方法解析順序。搜索從type後面的類開始。

例如,如果object-or-type的__mro__是D -> B -> C -> A ->object,type的值是B,那麼super()搜索C -> A ->object。

object-or-type的__mro__屬性列出了getattr()和super()使用的方法解析搜索順序。屬性是動態的,可以在繼承層次結構更新時更改。

如果省略第二個參數,則返回的超對象將不受上述約束。如果第二個參數是一個對象obj,則isinstance(obj, type)必須為真。如果第二個參數是類型type2,則issubclass(type2, type)必須為真(這對類方法很有用)。

super有兩個典型的用例。在單繼承的類層次結構中,可以使用super引用父類,而不必顯式地命名它們,從而使代碼更易於維護。這種用法與其他編程語言中super的用法非常相似。

第二個用例是支持動態執行環境中的協作多繼承。這個用例是Python特有的,在靜態編譯語言或只支持單繼承的語言中是找不到的。這使得實現其中多個基類實現了相同方法的“菱形圖”成為可能。良好的設計要求此方法在每種情況下都具有相同的調用簽名(因為調用的順序是在運行時確定的,而且該順序適應類層次結構中的更改,以及該順序可以包含運行時之前未知的兄弟類)。

對於這兩個用例,一個典型的超類調用是這樣的:

<code>class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)/<code>

除了方法查找之外,super()還可以用於屬性查找。一個用例是調用在父類或兄弟類中的描述符。

注意,super()是作為顯式點屬性查找(如super().__ getitem__(name))的綁定過程的一部分實現的。它通過實現自己的__getattribute__()方法來實現這一點,該方法用於支持多繼承的可預測的順序搜索類。因此,對於使用語句或super()[name]等操作符的隱式查找,super()是未定義的。

還要注意,除了zero參數形式之外,super()並不侷限於在方法內部使用。兩參數形式的super精確地指定了參數,可以更加準確地引用父類。zero參數形式只在類定義中起作用,因為編譯器會填充必要的細節以正確地檢索正在定義的類,以及訪問普通方法的當前實例。

關於"標準庫內置函數"的內容本篇未完,下篇將繼續講解】

【結束】

篇尾寄語:萬丈高樓平地起,是否具有紮實的基礎決定一個人能否走遠以及能走多遠。Python的學習也是同樣的道理!


分享到:


相關文章: