Python中包含了許多內建的語言特性,它們使得代碼簡潔且易于理解。這些特性包括列表/集合/字典推導式,屬性(property)、以及裝飾器(decorator)。對于大部分特性來說,這些“中級”的語言特性有著完善的文檔,并且易于學習。
但是這里有個例外,那就是描述符。至少對于我來說,描述符是Python語言核心中困擾我時間最長的一個特性。這里有幾點原因如下:
1.有關描述符的官方文檔相當難懂,而且沒有包含優秀的示例告訴你為什么需要編寫描述符(我得為Raymond Hettinger辯護一下,他寫的其他主題的Python文章和視頻對我的幫助還是非常大的)
2.編寫描述符的語法顯得有些怪異
3.自定義描述符可能是Python中用的最少的特性,因此你很難在開源項目中找到優秀的示例
但是一旦你理解了之后,描述符的確還是有它的應用價值的。這篇文章告訴你描述符可以用來做什么,以及為什么應該引起你的注意。
一句話概括:描述符就是可重用的屬性
在這里我要告訴你:從根本上講,描述符就是可以重復使用的屬性。也就是說,描述符可以讓你編寫這樣的代碼:
代碼如下:
f = Foo()
b = f.bar
f.bar = c
del f.bar
而在解釋器執行上述代碼時,當發現你試圖訪問屬性(b = f.bar)、對屬性賦值(f.bar = c)或者刪除一個實例變量的屬性(del f.bar)時,就會去調用自定義的方法。
讓我們先來解釋一下為什么把對函數的調用偽裝成對屬性的訪問是大有好處的。
property——把函數調用偽裝成對屬性的訪問
想象一下你正在編寫管理電影信息的代碼。你最后寫好的Movie類可能看上去是這樣的:
代碼如下:
class Movie(object):
def __init__(self, title, rating, runtime, budget, gross):
self.title = title
self.rating = rating
self.runtime = runtime
self.budget = budget
self.gross = gross
def profit(self):
return self.gross - self.budget
你開始在項目的其他地方使用這個類,但是之后你意識到:如果不小心給電影打了負分怎么辦?你覺得這是錯誤的行為,希望Movie類可以阻止這個錯誤。 你首先想到的辦法是將Movie類修改為這樣:
代碼如下:
class Movie(object):
def __init__(self, title, rating, runtime, budget, gross):
self.title = title
self.rating = rating
新聞熱點
疑難解答