摘要:不像其他屬性,描述符在類級(jí)別上創(chuàng)建。當(dāng)所有者類被定義時(shí),每個(gè)描述符對(duì)象都是被綁定到一個(gè)不同的類級(jí)別屬性的描述符類實(shí)例。這必須返回描述符的值。此外,描述符對(duì)有一個(gè)方便的響應(yīng)和請(qǐng)求格式。
__getattribute__()方法注:原書(shū)作者 Steven F. Lott,原書(shū)名為 Mastering Object-oriented Python
__getattribute__()方法是一個(gè)更底層的屬性處理。它的默認(rèn)實(shí)現(xiàn)試圖把一個(gè)屬性作為一個(gè)已經(jīng)存在于內(nèi)部__dict__(或__slots__)的屬性來(lái)定位值。如果沒(méi)有找到該屬性,它會(huì)調(diào)用__getattr__()。如果值被定位為描述符(參見(jiàn)下面《創(chuàng)建描述符》部分),則處理描述符;否則只是簡(jiǎn)單的返回值。
通過(guò)重寫(xiě)此方法,我們可以完成以下任何一個(gè)任務(wù):
我們可以有效地防止對(duì)屬性的訪問(wèn)。這種方法通過(guò)拋出異常來(lái)代替返回一個(gè)值,可以使一個(gè)屬性比我們僅僅使用下劃線(_)將一個(gè)命名標(biāo)記為私有更私密。
我們可以發(fā)明新的屬性,類似于__getattr__()如何發(fā)明新的屬性。然而,在這種情況下,我們可以通過(guò)默認(rèn)版本的__getattribute__()來(lái)繞過(guò)默認(rèn)查找。
我們可以讓屬性執(zhí)行唯一且不同的任務(wù)。這會(huì)使得程序非常難以理解和維護(hù)。這是一個(gè)糟糕的想法。
我們可以改變描述符的行為。雖然技術(shù)上可能,但改變一個(gè)描述符的行為是一個(gè)可怕的想法。
在我們實(shí)現(xiàn)__getattribute__()方法時(shí),重要的是要注意在方法體中不能有任何的內(nèi)部屬性訪問(wèn)。如果我們?cè)噲D通過(guò)self.name獲取值,將導(dǎo)致無(wú)限遞歸。
__getattribute__()方法不能提供任何簡(jiǎn)單的self.name屬性訪問(wèn),這將導(dǎo)致無(wú)限遞歸。
為了在__getattribute__()方法中獲取屬性值,我們必須顯式地訪問(wèn)object定義的基礎(chǔ)方法,如以下所示聲明:
object.__getattribute__(self, name)
例如,我們可以使用__getattribute__()修改我們的不可變類以及防止訪問(wèn)內(nèi)部__dict__屬性。下面這個(gè)類,隱藏了所有以下劃線(_)開(kāi)頭的命名:
class BlackJackCard3: """Abstract Superclass""" def __init__(self, rank, suit, hard, soft): super().__setattr__("rank", rank) super().__setattr__("suit", suit) super().__setattr__("hard", hard) super().__setattr__("soft", soft) def __setattr__(self, name, value): if name in self.__dict__: raise AttributeError("Cannot set {name}".format(name=name)) raise AttributeError(""{__class__.__name__}" has no attribute "{name}"".format(__class__= self.__class__, name= name)) def __getattribute__(self, name): if name.startswith("_"): raise AttributeError return object.__getattribute__(self, name)
我們已經(jīng)覆寫(xiě)了__getattribute__()的私有名稱以及Python內(nèi)部名稱來(lái)拋出一個(gè)屬性錯(cuò)誤。這前面的示例有一個(gè)微小的優(yōu)勢(shì):我們不再允許調(diào)整對(duì)象。我們將會(huì)看到該類的實(shí)例交互的示例。
下面示例是該類對(duì)象的變形:
>>> c = BlackJackCard3("A", "?", 1, 11) >>> c.rank = 12 Traceback (most recent call last): File "", line 1, in File " ", line 9, in __setattr__ File " ", line 13, in __getattribute__ AttributeError >>> c.__dict__["rank"]= 12 Traceback (most recent call last): File " ", line 1, in File " ", line 13, in __getattribute__ AttributeError
通常建議,搞混__getattribute__()不是一個(gè)好主意。默認(rèn)方法相當(dāng)復(fù)雜,而且?guī)缀跛形覀冃枰亩际亲鳛樘匦岳没蜃鳛?b>__getattr__()的改變。
創(chuàng)建描述符描述符是調(diào)和屬性訪問(wèn)的一個(gè)類。描述符類可用來(lái)獲取、設(shè)置或刪除屬性值。描述符對(duì)象是在類定義的時(shí)候構(gòu)建在一個(gè)類中的。
描述符設(shè)計(jì)模式有兩個(gè)部分:一個(gè)所有者類和屬性描述符本身。所有者類給它的屬性使用一個(gè)或多個(gè)描述符。描述符類定義了獲取、設(shè)置和刪除方法的組合。描述符類的一個(gè)實(shí)例將會(huì)是所有者類的一個(gè)屬性。
特性是基于所有者類的方法函數(shù)。描述符不像特性,是一個(gè)類的實(shí)例,與所有者類不同。因此,描述符通常是可重用的通用屬性。所有者類可以有多個(gè)不同描述符類的實(shí)例來(lái)類管理具有相似行為的屬性。
不像其他屬性,描述符在類級(jí)別上創(chuàng)建。它們不是在__init()__初始化時(shí)創(chuàng)建。然而描述符的值可以在初始化期間設(shè)置,描述符通常是作為類的一部分,在任何方法函數(shù)之外來(lái)構(gòu)建的。
當(dāng)所有者類被定義時(shí),每個(gè)描述符對(duì)象都是被綁定到一個(gè)不同的類級(jí)別屬性的描述符類實(shí)例。
被確認(rèn)為一個(gè)描述符,一個(gè)類必須實(shí)現(xiàn)以下三個(gè)方法的任意組合。
Descriptor.__get__(self, instance, owner) -> object:在這個(gè)方法中,instance參數(shù)是即將被訪問(wèn)的對(duì)象的self變量。owner參數(shù)是所有者類的對(duì)象。如果這個(gè)描述符在類的上下文中被調(diào)用,instance參數(shù)將得到一個(gè)None值。這必須返回描述符的值。
Descriptor.__set__(self, instance, value):在這個(gè)方法中,instance參數(shù)是即將被訪問(wèn)的對(duì)象的self變量。value參數(shù)是描述符需要設(shè)置的新值。
Descriptor.__delete__(self, instance)在這個(gè)方法中,instance參數(shù)是即將被訪問(wèn)的對(duì)象的self變量。該描述符的方法必須刪除這個(gè)屬性的值。
有時(shí),一個(gè)描述符類還將需要一個(gè)__init__()方法函數(shù)來(lái)初始化描述符的內(nèi)部狀態(tài)。
有兩種基于已定義方法的描述符,如下所示:
非數(shù)據(jù)描述符:這種描述符定義__set__()或__delete__()或兩者皆有。它不能定義__get__()。非數(shù)據(jù)描述符對(duì)象往往會(huì)被用作表達(dá)式的一部分。它可能是一個(gè)可調(diào)用對(duì)象,或者它可能有自己的屬性或方法。一個(gè)不可變的非數(shù)據(jù)描述符必須實(shí)現(xiàn)__set__(),但可能只是拋出AttributeError。這些描述符設(shè)計(jì)時(shí)很簡(jiǎn)單,因?yàn)榻涌诟`活。
數(shù)據(jù)描述符:這種描述符至少定義__get__()。通常,它定義__get__()和__set__()來(lái)創(chuàng)建一個(gè)可變對(duì)象。鑒于描述符將在很大程度上是不可見(jiàn)的,則不能更進(jìn)一步的再定義屬性或方法。屬性的引用有一個(gè)數(shù)據(jù)描述符的數(shù)據(jù)被委托給描述符的__get__()、__set__()或__delete__()方法。這些是很難設(shè)計(jì)的,所以我們稍后來(lái)再看。
描述符有各種各樣的用例。在內(nèi)部,Python使用描述符有以下幾個(gè)原因:
在隱藏的內(nèi)部,類的方法是作為描述符來(lái)實(shí)現(xiàn)。這些非數(shù)據(jù)描述符應(yīng)用方法函數(shù)到對(duì)象以及不同的參數(shù)值。
property()函數(shù)通過(guò)給一個(gè)字段創(chuàng)建數(shù)據(jù)描述符來(lái)實(shí)現(xiàn)。
一個(gè)類方法或靜態(tài)方法被實(shí)現(xiàn)為一個(gè)描述符;這被應(yīng)用到類中來(lái)代替類的實(shí)例。
當(dāng)我們?cè)诘?1章《通過(guò)SQLite存儲(chǔ)和檢索對(duì)象》看到對(duì)象-關(guān)系映射的時(shí)候,我們將看到許多ORM類定義大量使用描述符將Python類映射到SQL表和列。
當(dāng)我們考慮一個(gè)描述符的目的,我們還必須為數(shù)據(jù)作為描述符可以正常工作來(lái)考察三種常見(jiàn)用例,如下所示:
描述符對(duì)象有數(shù)據(jù)或獲取到了數(shù)據(jù)。在這種情況下,描述符對(duì)象的self變量是有意義的且描述符是有狀態(tài)的。數(shù)據(jù)描述符的__get__()方法返回這個(gè)內(nèi)部數(shù)據(jù)。非數(shù)據(jù)描述符,描述符有其他方法或?qū)傩詠?lái)訪問(wèn)這些數(shù)據(jù)。
包含數(shù)據(jù)的所有者實(shí)例。在這種情況下,描述符對(duì)象必須使用instance參數(shù)來(lái)引用值到所有者對(duì)象中。數(shù)據(jù)描述符的__get__()方法從實(shí)例獲取數(shù)據(jù)。非數(shù)據(jù)描述符有其他方法訪問(wèn)實(shí)例數(shù)據(jù)。
包含相關(guān)數(shù)據(jù)的所有者類。在這種情況下,描述符對(duì)象必須使用owner參數(shù)。這是常用的當(dāng)描述符實(shí)現(xiàn)了應(yīng)用于整個(gè)類的靜態(tài)方法或類方法。
我們將仔細(xì)看下第一種情況。我們看看創(chuàng)建帶有__get__()和__set__()方法的數(shù)據(jù)描述符。我們也會(huì)看看創(chuàng)建沒(méi)有__get__()方法的非數(shù)據(jù)描述符。
第二種情況(所有者實(shí)例中的數(shù)據(jù))展示了@property裝飾器都做了些什么。可能的優(yōu)勢(shì)是描述符有一個(gè)傳統(tǒng)的特性將計(jì)算從擁有者類移到描述符類中。這傾向于分片類設(shè)計(jì)且可能不是最好的方法。如果計(jì)算是真正史詩(shī)般的復(fù)雜,策略模式可能會(huì)更好。
第三種情況展示@staticmethod和@classmethod裝飾器是如何實(shí)現(xiàn)的。我們不需要重新發(fā)明輪子。
1、使用非數(shù)據(jù)描述符我們經(jīng)常會(huì)有一些緊密綁定了屬性值的小對(duì)象。對(duì)于這個(gè)示例,我們將看看數(shù)值被綁定到單位的舉措。
下面是一個(gè)簡(jiǎn)單的非數(shù)據(jù)描述符類,它缺少一個(gè)__get__()方法:
class UnitValue_1: """Measure and Unit combined.""" def __init__(self, unit): self.value = None self.unit = unit self.default_format = "5.2f" def __set__(self, instance, value): self.value = value def __str__(self): return "{value:{spec}} {unit}" .format(spec=self.default_format, **self.__dict__) def __format__(self, spec="5.2f"): #print( "formatting", spec ) if spec == "": spec = self.default_format return "{value:{spec}} {unit}".format(spec=spec, **self.__dict__)
這個(gè)類定義了一對(duì)簡(jiǎn)單的值,一個(gè)可變的(值),另一個(gè)是有效的不可變對(duì)象(單位)。
當(dāng)這個(gè)描述符被訪問(wèn)時(shí),描述符對(duì)象本身是可用的,且描述符的其他方法或?qū)傩钥梢员皇褂谩N覀兛梢允褂眠@個(gè)描述符來(lái)創(chuàng)建類去管理尺寸和其他與物理單位有關(guān)的數(shù)值。
下面是一個(gè)類,做速度-時(shí)間-距離的及早計(jì)算:
class RTD_1: rate = UnitValue_1("kt") time = UnitValue_1("hr") distance = UnitValue_1("nm") def __init__(self, rate=None, time=None, distance=None): if rate is None: self.time = time self.distance = distance self.rate = distance / time if time is None: self.rate = rate self.distance = distance self.time = distance / rate if distance is None: self.rate = rate self.time = time self.distance = rate * time def __str__(self): return "rate: {0.rate} time: {0.time} distance:{0.distance}".format(self)
一旦對(duì)象被創(chuàng)建且屬性被加載,丟失的值就已經(jīng)被計(jì)算。一旦計(jì)算,描述符可以檢查獲取值或單位的名稱。此外,描述符對(duì)str()有一個(gè)方便的響應(yīng)和請(qǐng)求格式。
下面是描述符和RTD_1類之間的交互:
>>> m1 = RTD_1(rate=5.8, distance=12) >>> str(m1) "rate: 5.80 kt time: 2.07 hr distance: 12.00 nm" >>> print("Time:", m1.time.value, m1.time.unit) Time: 2.0689655172413794 hr
我們創(chuàng)建了一個(gè)帶有rate和distance參數(shù)的RTD_1實(shí)例。這些都是用來(lái)計(jì)算rate和distance描述符的__set__()方法。
當(dāng)我們請(qǐng)求str(m1),這會(huì)計(jì)算RTD_1的所有str()方法,轉(zhuǎn)而使用rate、time和distance描述符的__format__()方法。這為我們提供了數(shù)字和單位。
鑒于非數(shù)據(jù)描述符沒(méi)有__get__()且不返回其內(nèi)部值,我們可以訪問(wèn)描述符的單個(gè)元素。
2、使用數(shù)據(jù)描述符數(shù)據(jù)描述符設(shè)計(jì)要復(fù)雜一些,因?yàn)樗鼘?duì)接口有限制。它必須有一個(gè)__get__()方法,且只能有__set__()或__delete__()。這是所有的接口:這些方法從一到三,沒(méi)有其他方法。引入一個(gè)額外的方法意味著Python不會(huì)把該類當(dāng)作一個(gè)正確的數(shù)據(jù)描述符。
我們會(huì)使用描述符設(shè)計(jì)一個(gè)簡(jiǎn)單的單位轉(zhuǎn)換模式,可以在__get__()和__set__()方法做適當(dāng)?shù)霓D(zhuǎn)換。
下面是一個(gè)單位描述符的超類,它在其他單位和標(biāo)準(zhǔn)單位之間做轉(zhuǎn)換:
class Unit: conversion = 1.0 def __get__(self, instance, owner): return instance.kph * self.conversion def __set__(self, instance, value): instance.kph = value / self.conversion
該類用簡(jiǎn)單的乘法和除法將標(biāo)準(zhǔn)單位轉(zhuǎn)換為其他非標(biāo)準(zhǔn)單位,反之亦然。
通過(guò)這個(gè)超類,我們可以從一個(gè)標(biāo)準(zhǔn)單位定義一些轉(zhuǎn)換。在前面的示例,標(biāo)準(zhǔn)單位是千米時(shí)(公里/小時(shí))。
以下是這兩個(gè)轉(zhuǎn)換描述符
class Knots(Unit): conversion = 0.5399568 class MPH(Unit): conversion = 0.62137119
繼承方法非常有用。唯一改變的是轉(zhuǎn)換因子。這些類可用于處理涉及單位轉(zhuǎn)換的值。我們可以處理英里每小時(shí)或可交換的節(jié)點(diǎn)。下面是一個(gè)標(biāo)準(zhǔn)單位的單位描述符,公里每小時(shí):
class KPH(Unit): def __get__(self, instance, owner): return instance._kph def __set__(self, instance, value): instance._kph = value
這個(gè)類代表一個(gè)標(biāo)準(zhǔn),所以不做任何轉(zhuǎn)換。它使用一個(gè)私有變量實(shí)例保存速度千米每小時(shí)的標(biāo)準(zhǔn)值。避免任何算術(shù)轉(zhuǎn)換是一個(gè)簡(jiǎn)單的技術(shù)優(yōu)化。避免任何一個(gè)公共字段的引用是至關(guān)重要的,來(lái)規(guī)避無(wú)限遞歸。
下面這個(gè)類,它對(duì)于一個(gè)給定的尺寸提供了一組轉(zhuǎn)換:
class Measurement: kph = KPH() knots = Knots() mph = MPH() def __init__(self, kph=None, mph=None, knots=None): if kph: self.kph = kph elif mph: self.mph = mph elif knots: self.knots = knots else: raise TypeError def __str__(self): return "rate: {0.kph} kph = {0.mph} mph = {0.knots} knots".format(self)
對(duì)于不同的單位每個(gè)類級(jí)別的屬性都是描述符。各種描述符的獲取和設(shè)置方法會(huì)做適當(dāng)?shù)霓D(zhuǎn)換。我們可以使用這個(gè)類在各種單位之間進(jìn)行速度轉(zhuǎn)換。
以下是與Measurement類交互的一個(gè)例子:
>>> m2 = Measurement(knots=5.9) >>> str(m2) "rate: 10.92680006993152 kph = 6.789598762345432 mph = 5.9 knots" >>> m2.kph 10.92680006993152 >>> m2.mph 6.789598762345432
我們通過(guò)設(shè)置不同的描述符創(chuàng)建了一個(gè)Measurement類的對(duì)象。在第一個(gè)示例中,我們?cè)O(shè)置了節(jié)點(diǎn)描述符。
當(dāng)我們顯示的值是一個(gè)大字符串,則每個(gè)描述符的__get__()都將被使用。這些方法從所有者對(duì)象獲取內(nèi)部kph字段值,應(yīng)用一個(gè)轉(zhuǎn)換因子,且返回一個(gè)結(jié)果值。
kph字段還使用了一個(gè)描述符。這個(gè)描述符不做任何轉(zhuǎn)換;然而,它只是返回了緩存在所有者對(duì)象的私有值。KPH和Knots描述符要求所有者類實(shí)現(xiàn)一個(gè)kph屬性。
總結(jié),設(shè)計(jì)要素和權(quán)衡在這一章,我們研究了幾種使用一個(gè)對(duì)象屬性的方式。我們可以使用內(nèi)置object類的特性以及獲取和設(shè)置屬性值。我們可以定義屬性來(lái)修改屬性的行為。
如果我們想要更復(fù)雜,我們可以調(diào)整底層__getattr__()、__setattr__()、__delattr__()或__getattribute__()特殊方法實(shí)現(xiàn)。這些讓我們可以更精細(xì)的控制字段的行為。當(dāng)我們接觸到這些方法我們走的很順利,因?yàn)槲覀兛梢詫?duì)Python的行為進(jìn)行基本(和令人困惑的)改變。
在內(nèi)部,Python使用描述符來(lái)實(shí)現(xiàn)特性,例如方法函數(shù)、靜態(tài)方法函數(shù)和屬性。描述符許多很酷的用例已經(jīng)是語(yǔ)言的最好的特性。
來(lái)自其他語(yǔ)言(特別是Java和c++)的程序員通常有試圖讓所有屬性私有以及編寫(xiě)大量的getter和setter函數(shù)的沖動(dòng)。
在Python中,將所有屬性作當(dāng)作公有的是相當(dāng)簡(jiǎn)單的。這意味著如下:
它們應(yīng)該有良好的文檔記錄。
它們應(yīng)該正確的反映對(duì)象的狀態(tài),它們不應(yīng)該是暫時(shí)的或臨時(shí)的值。
一個(gè)字段有令人困惑的(或易變的)字段值是非常罕見(jiàn)的,一個(gè)以下劃線(_)開(kāi)頭的命名作為“不是已定義接口中的一部分”不是真的私有。
把私有字段看做麻煩事是很重要的。在語(yǔ)言中封裝并沒(méi)有因?yàn)槿狈?fù)雜的私有機(jī)制而受損;而會(huì)因?yàn)樵愀獾脑O(shè)計(jì)而受損。
1、特性對(duì)屬性在大多數(shù)情況下,字段可以設(shè)置在類之外且沒(méi)有不良后果。我們的Hand類的示例展示了這一點(diǎn)。對(duì)于許多版本的類,我們可以簡(jiǎn)單地追加到hand.cards,以及完美的工作通過(guò)特性延遲計(jì)算total。
在改變屬性這種情況下,會(huì)導(dǎo)致相應(yīng)的其他字段的變化,這需要一些更復(fù)雜的類設(shè)計(jì):
一個(gè)方法函數(shù)可以闡明狀態(tài)變化。當(dāng)需要多個(gè)參數(shù)值時(shí)這將是必要的。
一個(gè)特性setter可能比一個(gè)方法函數(shù)更清晰。當(dāng)需要單個(gè)值時(shí)這將是一個(gè)明智的選擇。
我們還可以使用原地操作符。我們將到第七章《創(chuàng)造數(shù)字》看到這些。
沒(méi)有嚴(yán)格的規(guī)則。在這種情況下,我們需要設(shè)置一個(gè)參數(shù)值,方法函數(shù)和特性之間的區(qū)別完全是API語(yǔ)法和如何傳達(dá)意圖的區(qū)別。
為了計(jì)算值,特性允許延遲計(jì)算,而一個(gè)屬性需要及早計(jì)算。這是性能的問(wèn)題。延遲計(jì)算對(duì)及早計(jì)算的優(yōu)勢(shì)是基于對(duì)用例的預(yù)期。
2、使用描述符設(shè)計(jì)很多描述符的示例已經(jīng)是Python的一部分。我們不需要重復(fù)特性、類方法或靜態(tài)方法。
創(chuàng)建新的描述符最引人注目的情況是在Python和一些非Python之間建立映射關(guān)系。例如,對(duì)象-關(guān)系數(shù)據(jù)庫(kù)映射,需要大量的維護(hù)以確保一個(gè)Python類有正確的屬性以正確的順序匹配一個(gè)SQL表和列。同樣,當(dāng)映射到一些Python之外,一個(gè)描述符類可以處理數(shù)據(jù)編碼和解碼或從外部獲取數(shù)據(jù)來(lái)源。
當(dāng)構(gòu)建一個(gè)web服務(wù)端,我們可能會(huì)考慮使用描述符來(lái)做web服務(wù)請(qǐng)求。例如,__get__()方法可能會(huì)變成一個(gè)HTTP的GET請(qǐng)求,__set__()方法可能會(huì)變成一個(gè)HTTP的PUT請(qǐng)求。
在某些情況下,一個(gè)單一的請(qǐng)求可能填充幾個(gè)描述符的數(shù)據(jù)。在這種情況下,__get__()方法將檢查實(shí)例的緩存以及在一個(gè)HTTP請(qǐng)求之前返回一個(gè)值。
通過(guò)屬性來(lái)操作許多數(shù)據(jù)描述符操作會(huì)非常簡(jiǎn)單。這給我們提供開(kāi)始的機(jī)會(huì):首先編寫(xiě)屬性。如果屬性處理變得非常昂貴和復(fù)雜,則我們可以切換到描述符來(lái)對(duì)類進(jìn)行重構(gòu)。
3、展望未來(lái)在下一章,我們將密切關(guān)注將在5、6、7章探索的ABCs(抽象基類)。這些基礎(chǔ)知識(shí)將幫助我們定義類,它會(huì)與現(xiàn)有Python特性很好地集成。它們還將允許我們創(chuàng)建執(zhí)行一致的設(shè)計(jì)和擴(kuò)展的類層次結(jié)構(gòu)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44197.html
摘要:許多程序員發(fā)現(xiàn)賦值語(yǔ)句比方法函數(shù)看起來(lái)更清晰。自從和屬性的創(chuàng)建來(lái)自,我們必須經(jīng)常定義特性使用如下代碼這允許我們用一條簡(jiǎn)單的語(yǔ)句添加一張牌到手中像下面這樣前面的賦值語(yǔ)句有一個(gè)缺點(diǎn),因?yàn)樗雌饋?lái)像一張牌替代了所有的牌。 注:原書(shū)作者 Steven F. Lott,原書(shū)名為 Mastering Object-oriented Python 對(duì)象就是一些特性的集合,包括方法和屬性。object...
摘要:第一是在對(duì)象生命周期中初始化是最重要的一步每個(gè)對(duì)象必須正確初始化后才能正常工作。第二是參數(shù)值可以有多種形式?;悓?duì)象的方法對(duì)象生命周期的基礎(chǔ)是它的創(chuàng)建初始化和銷毀。在某些情況下,這種默認(rèn)行為是可以接受的。 注:原書(shū)作者 Steven F. Lott,原書(shū)名為 Mastering Object-oriented Python __init__()方法意義重大的原因有兩個(gè)。第一是在對(duì)象生命...
摘要:請(qǐng)注意,我們?cè)诹牧膯卧獪y(cè)試遇到問(wèn)題多思考多查閱多驗(yàn)證,方能有所得,再勤快點(diǎn)樂(lè)于分享,才能寫(xiě)出好文章。單元測(cè)試是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。 JAVA容器-自問(wèn)自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用,而且面試中也很頻繁會(huì)問(wèn)到,因?yàn)樗锩嫣N(yùn)含著很多知識(shí)點(diǎn),可以很好的考察個(gè)人基礎(chǔ)。但一個(gè)這么重要的東西,我為什么沒(méi)有在一開(kāi)始...
摘要:所以搞清楚是理解對(duì)象屬性描述符的唯一途徑。是一個(gè)對(duì)象,對(duì)象里的屬性描述符有兩種類型數(shù)據(jù)描述符和存取描述符。描述符必須是這兩種形式之一不能同時(shí)是兩者。描述符中未顯示設(shè)置的特性使用其默認(rèn)值。創(chuàng)建一個(gè)新屬性默認(rèn)描述符的鍵值都是或者。 對(duì)象屬性描述符 當(dāng)別人對(duì)你提及對(duì)象屬性描述符,可能會(huì)蒙逼。而如果提及對(duì)象屬性的 get/set 方法就秒懂了,標(biāo)準(zhǔn)描述和習(xí)慣表述在這里有些差別,但是指向的是同一...
閱讀 664·2021-11-15 11:39
閱讀 2901·2021-10-08 10:04
閱讀 3265·2019-08-30 10:57
閱讀 3025·2019-08-26 13:25
閱讀 1908·2019-08-26 12:14
閱讀 2636·2019-08-23 15:27
閱讀 2996·2019-08-23 15:18
閱讀 1777·2019-08-23 14:26