您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關python面向對象的使用案例的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
面向對象
1. 創建支持With語句的對象
我們都知道如何使用打開或關閉語句,例如打開文件或獲取鎖,但是如何實現自己的方法呢?
可以使用__enter__和__exit__方法實現:
class Connection: def __init__(self): ... def __enter__(self): # Initialize connection... def __exit__(self, type, value, traceback): # Close connection... with Connection() as c: # __enter__() executes ... # conn.__exit__() executes
這是在Python中實現上下文管理的最常見方法,但是有一種更簡單的方法:
from contextlib import contextmanager @contextmanager def tag(name): print(f"<{name}>") yield print(f"</{name}>") with tag("h2"): print("This is Title.")
上面的代碼段使用contextmanager管理器裝飾器實現了內容管理協議。進入with塊時,執行標記函數的第一部分(在yield之前),然后執行該塊,最后執行其余的標記函數。
2. 重載運算符號的技巧
考慮到有很多比較運算符:__lt__ , __le__ , __gt__,對于一個類實現所有比較運算符可能會很煩人。這時候可以使用functools.total_ordering:
from functools import total_ordering @total_ordering class Number: def __init__(self, value): self.value = value def __lt__(self, other): return self.value < other.value def __eq__(self, other): return self.value == other.value print(Number(20) > Number(3)) print(Number(1) < Number(5)) print(Number(15) >= Number(15)) print(Number(10) <= Number(2))
該代碼使用total_ordering裝飾器用于簡化為類實現實例排序的過程。只需要定義__lt__和__eq__。
3. 在一個類中定義多個構造函數
函數重載是編程語言中非常常見的功能。即使Python不能重載正常的函數,我們也可以使用類方法重載構造函數:
import datetime class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def today(cls): t = datetime.datetime.now() return cls(t.year, t.month, t.day) d = Date.today() print(f"{d.day}/{d.month}/{d.year}")
# 14/9/2019
可以不使用構造函數將所有邏輯都放入__init__并使用*args,**kwargs和一堆if語句來解決,但是比較丑陋,沒有可讀性和可維護性。
4. 獲取對象信息
Python提供了幾個函數以便我們更好的獲取對象的信息,這些函數包括:type、isinstance和dir。
其中type():用于判斷對象類型:
>>> type(None) <class 'NoneType'> >>> type(abs) <class 'builtin_function_or_method'>
對類對象type()返回的是對應class類型。下面是判斷兩個變量的type類型是否相同:
>>> type(11) == type(22) True >>> type('abc') == str True >>> type('abc') == type(33) False
isinstance():可以顯示對象是否是某種類型
>>> class Husty(Dog): ... pass ... >>> a = Animal() >>> b = Dog() >>> c = Husty() >>> isinstance(c,Husty) True >>> isinstance(c,Dog) True >>> isinstance(c,Animal) True >>> isinstance(b,Husty) False
Husty是Husty、Dog、Animal類型的對象,卻不能說Dog是Husty的對象。
dir():用于獲取一個對象的所有方法和屬性。返回值是一個包含字符串的list:
>>> dir('abc') ['__add__', '__class__',…… '__hash__', '__init__', '__i ……'isalnum 'isidentifier', 'islower', …… 'translate', 'upper', 'zfill']
其中,類似__xx__的屬性和方法都是有特殊用途的。如果調用len()函數視圖獲取一個對象的長度,其實在len()函數內部會自動去調用該對象的__len__()方法。
5. Iterator和切片
如果直接對Iterator切片,則會得到TypeError,指出生成器對象不可下標反問,但是有一個技巧:
import itertools s = itertools.islice(range(50), 10, 20) for val in s: ...
使用itertools.islice,可以創建一個islice對象,該對象是生成所需項目的迭代器。但是,這會消耗所有生成器項,直到分片開始為止,而且還會消耗islice對象中的所有項。
6. 跳過一些行
有時,必須使用已知以可變數量的不需要的行(例如注釋)。也可以使用itertools:
string_from_file = """ // Author: ... // License: ... // // Date: ... Actual content... """ import itertools for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")): print(line)
該代碼段僅在初始注釋部分之后產生行。如果只想在迭代器的開頭丟棄并且不知道其中有多少個項目,則此方法很有用。
7. 命名切片
使用大量硬編碼的索引值會很容易引起代碼繁瑣和破壞代碼可讀性。常用的技巧是對索引值使用常量,除此之外我們可以使用命名切片:
示例中,可以看到可以索引,方法是先使用slice函數命名它們,然后在切出一部分字符串時使用它們。還可以使用切片對象的屬性.start,.stop和.step獲得更多信息。
感謝各位的閱讀!關于“python面向對象的使用案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。