国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Python 的 descriptor(上)

yexiaobai / 1695人閱讀

摘要:事實(shí)上實(shí)例的實(shí)現(xiàn)方式與上面的實(shí)例類(lèi)似。其次,為了實(shí)現(xiàn)確實(shí)對(duì)屬性的調(diào)用順序做出了相應(yīng)的調(diào)整,這些將會(huì)的下中介紹。參考資料如何理解的中基于的一些概念上中基于的一些概念下的官方文檔描述符解密的官方文檔

Python 在 2.2 版本中引入了descriptor(描述符)功能,也正是基于這個(gè)功能實(shí)現(xiàn)了新式類(lèi)(new-styel class)的對(duì)象模型,同時(shí)解決了之前版本中經(jīng)典類(lèi) (classic class) 系統(tǒng)中出現(xiàn)的多重繼承中的 MRO(Method Resolution Order) 問(wèn)題,另外還引入了一些新的概念,比如 classmethod, staticmethod, super, Property 等。因此理解 descriptor 有助于更好地了解 Python 的運(yùn)行機(jī)制。

那么什么是 descriptor 呢?

簡(jiǎn)而言之:descriptor 就是一類(lèi)實(shí)現(xiàn)了__get__(), __set__(), __delete__()方法的對(duì)象。

Orz...如果你瞬間頓悟了,那么請(qǐng)收下我的膝蓋;
O_o!...如果似懂非懂,那么恭喜你!說(shuō)明你潛力很大,咱們可以繼續(xù)挖掘:

引言

對(duì)于陌生的事物,一個(gè)具體的栗子是最好的學(xué)習(xí)方式,首先來(lái)看這樣一個(gè)問(wèn)題:假設(shè)我們給一次數(shù)學(xué)考試創(chuàng)建一個(gè)類(lèi),用于記錄每個(gè)學(xué)生的學(xué)號(hào)、數(shù)學(xué)成績(jī)、以及提供一個(gè)用于判斷是否通過(guò)考試的check 函數(shù):

class MathScore():
    
    def __init__(self, std_id, score):
        self.std_id = std_id
        self.score = score

    def check(self):
        if self.score >= 60:
            return "pass"
        else:
            return "failed"            

很簡(jiǎn)單一個(gè)示例,看起來(lái)運(yùn)行的不錯(cuò):

xiaoming = MathScore(10, 90)

xiaoming.score
Out[3]: 90

xiaoming.std_id
Out[4]: 10

xiaoming.check()
Out[5]: "pass"

但是會(huì)有一個(gè)問(wèn)題,比如手一抖錄入了一個(gè)負(fù)分?jǐn)?shù),那么他就得悲劇的掛了:

xiaoming = MathScore(10, -90)

xiaoming.score
Out[8]: -90

xiaoming.check()
Out[9]: "failed"

這顯然是一個(gè)嚴(yán)重的問(wèn)題,怎么能讓一個(gè)數(shù)學(xué) 90+ 的孩子掛科呢,于是乎一個(gè)簡(jiǎn)單粗暴的方法就誕生了:

class MathScore():
    
    def __init__(self, std_id, score):
        self.std_id = std_id
        if score < 0:
            raise ValueError("Score can"t be negative number!")
        self.score = score

    def check(self):
        if self.score >= 60:
            return "pass"
        else:
            return "failed"                     

上面再類(lèi)的初始化函數(shù)中增加了負(fù)數(shù)判斷,雖然不夠優(yōu)雅,甚至有點(diǎn)拙劣,但這在實(shí)例初始化時(shí)確實(shí)工作的不錯(cuò):

xiaoming = MathScore(10, -90)

Traceback (most recent call last):

  File "", line 1, in 
    xiaoming = MathScore(10, -90)

  File "C:/Users/xu_zh/.spyder2-py3/temp.py", line 14, in __init__
    raise ValueError("Score can"t be negative number!")

ValueError: Score can"t be negative number!

OK, 但我們還無(wú)法阻止實(shí)例對(duì) score 的賦值操作,畢竟修改成績(jī)也是常有的事:

xiaoming = MathScore(10, 90)

xiaoming = -10    # 無(wú)法判斷出錯(cuò)誤

對(duì)于大多數(shù)童鞋,這個(gè)問(wèn)題 so easy 的啦:將 score 變?yōu)樗接校瑥亩?xiaoming.score 這樣的直接調(diào)用,增加一個(gè) get_score 和 set_score 用于讀寫(xiě):

class MathScore():
    
    def __init__(self, std_id, score):
        self.std_id = std_id
        if score < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = score

    def check(self):
        if self.__score >= 60:
            return "pass"
        else:
            return "failed"            
        
    def get_score(self):
        return self.__score
    
    def set_score(self, value):
        if value < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = value

這確實(shí)是種常見(jiàn)的解決方法,但是不得不說(shuō)這簡(jiǎn)直丑爆了:

調(diào)用成績(jī)?cè)僖膊荒苁褂?xiaoming.score 這樣自然的方式,需要使用 xiaoming.get_score() ,這看起來(lái)像口吃在說(shuō)話(huà)!
還有那反人類(lèi)的下劃線和括號(hào)...那應(yīng)該只出現(xiàn)在計(jì)算機(jī)之間竊竊私語(yǔ)之中...
賦值也無(wú)法使用 xiaoming.score = 80, 而需使用 xiaoming.set_score(80), 這對(duì)數(shù)學(xué)老師來(lái)說(shuō),太 TM 不自然了 !!!

作為一門(mén)簡(jiǎn)潔優(yōu)雅的編程語(yǔ)言,Python 是不會(huì)坐視不管的,于是其給出了 Property 類(lèi):

Property 類(lèi)

先不管 Property 是啥,咱先看看它是如何簡(jiǎn)潔優(yōu)雅的解決上面這個(gè)問(wèn)題的:

class MathScore():
    
    def __init__(self, std_id, score):
        self.std_id = std_id
        if score < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = score

    def check(self):
        if self.__score >= 60:
            return "pass"
        else:
            return "failed"            
        
    def __get_score__(self):
        return self.__score
    
    def __set_score__(self, value):
        if value < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = value
        
    score = property(__get_score__, __set_score__)

與上段代碼相比,主要是在最后一句實(shí)例化了一個(gè) property 實(shí)例,并取名為 score, 這個(gè)時(shí)候,我們就能如此自然的對(duì) instance.__score 進(jìn)行讀寫(xiě)了:

xiaoming = MathScore(10, 90)

xiaoming.score
Out[30]: 90

xiaoming.score = 80

xiaoming.score
Out[32]: 80

xiaoming.score = -90
Traceback (most recent call last):

  File "", line 1, in 
    xiaoming.score = -90

  File "C:/Users/xu_zh/.spyder2-py3/temp.py", line 28, in __set_score__
    raise ValueError("Score can"t be negative number!")

ValueError: Score can"t be negative number!

WOW~~一切工作正常!
嗯,那么問(wèn)題來(lái)了:它是怎么工作的呢?
先看下 property 的參數(shù):

class property(fget=None, fset=None, fdel=None, doc=None)  #拷貝自 Python 官方文檔

它的工作方式:

實(shí)例化 property 實(shí)例(我知道這是句廢話(huà));

調(diào)用 property 實(shí)例(比如xiaoming.score)會(huì)直接調(diào)用 fget,并由 fget 返回相應(yīng)值;

對(duì) property 實(shí)例進(jìn)行賦值操作(xiaoming.score = 80)則會(huì)調(diào)用 fset,并由 fset 定義完成相應(yīng)操作;

刪除 property 實(shí)例(del xiaoming),則會(huì)調(diào)用 fdel 實(shí)現(xiàn)該實(shí)例的刪除;

doc 則是該 property 實(shí)例的字符說(shuō)明;

fget/fset/fdel/doc 需自定義,如果只設(shè)置了fget,則該實(shí)例為只讀對(duì)象;

這看起來(lái)和本篇開(kāi)頭所說(shuō)的 descriptor 的功能非常相似,讓我們回顧一下 descriptor:

“descriptor 就是一類(lèi)實(shí)現(xiàn)了__get__(), __set__(), __delete__()方法的對(duì)象。”

@~@ 如果你這次又秒懂了,那么請(qǐng)?jiān)俅问障挛业南ドw Orz...

另外,Property 還有個(gè)裝飾器語(yǔ)法糖 @property,其所實(shí)現(xiàn)的功能與 property() 完全一樣:

class MathScore():
    
    def __init__(self, std_id, score):
        self.std_id = std_id
        if score < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = score

    def check(self):
        if self.__score >= 60:
            return "pass"
        else:
            return "failed"            
    
    @property    
    def score(self):
        return self.__score
    
    @score.setter
    def score(self, value):    #注意方法名稱(chēng)要與上面一致,否則會(huì)失效
        if value < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = value

我們知道了 property 實(shí)例的工作方式了,那么問(wèn)題又來(lái)了:它是怎么實(shí)現(xiàn)的?
事實(shí)上 Property 確實(shí)是基于 descriptor 而實(shí)現(xiàn)的,下面進(jìn)入我們的正題 descriptor 吧!

descriptor 描述符

照樣先不管 descriptor 是啥,咱們還是先看栗子,對(duì)于上面 Property 實(shí)現(xiàn)的功能,我們可以通過(guò)自定義的 descriptor 來(lái)實(shí)現(xiàn):

class NonNegative():
    
    def __init__(self):
        pass

    def __get__(self, ist, cls):
        return "descriptor get: " + str(ist._MathScore__score)  #這里加上字符描述便于看清調(diào)用

    def __set__(self, ist, value):
        if value < 0:
            raise ValueError("Score can"t be negative number!")
        print("descriptor set:", value)
        ist.__score = value
        
class MathScore():
    
    score = NonNegative()    

    def __init__(self, std_id, score):
        self.std_id = std_id
        if score < 0:
            raise ValueError("Score can"t be negative number!")
        self.__score = score
        
    def check(self):
        if self.__score >= 60:
            return "pass"
        else:
            return "failed"           

我們新定義了一個(gè) NonNegative 類(lèi),并在其內(nèi)實(shí)現(xiàn)了__get____set__方法,然后在 MathScore 類(lèi)中實(shí)例化了一個(gè) NonNegative 的實(shí)例 score,注意!!!重要的事情說(shuō)三遍:score 實(shí)例是 MathScore 的類(lèi)屬性!!!類(lèi)屬性!!!類(lèi)屬性!!!這個(gè) Mathscore.score 屬性同上面 Property 的 score 實(shí)例的功能是一樣的,只不過(guò) Mathscore.score 調(diào)用的 get、set 并不定義在 Mathscore 內(nèi),而是定義在 NonNegative 類(lèi)中,而 NonNegative 類(lèi)就是一個(gè) descriptor 對(duì)象!

納尼? NonNegative 類(lèi)的定義中可沒(méi)見(jiàn)到半個(gè) “descriptor” 的字樣,怎么就成了 descriptor 對(duì)象???

淡定! 重要的事情這里只說(shuō)一遍:任何實(shí)現(xiàn) __get____set____delete__ 方法中一至多個(gè)的類(lèi),就是 descriptor 對(duì)象。所以 NonNegative 自然是一個(gè) descriptor 對(duì)象。

那么 descriptor 對(duì)象與普通類(lèi)比有什么特別之處呢? 先不急,來(lái)看看上端代碼的效果:

xiaoming = MathScore(10, 90)

xiaoming.score
Out[67]: "descriptor get: 90"

xiaoming.score = 80
descriptor set: 80

wangerma = MathScore(11, 70)

wangerma.score
Out[70]: "descriptor get: 70"

wangerma.score = 60
Out[70]: descriptor set: 60

wangerma.score
Out[73]: "descriptor get: 60"

xiaoming.score
Out[74]: "descriptor get: 80"

xiaoming.score = -90

ValueError: Score can"t be negative number!

可以發(fā)現(xiàn),MathScore.score 雖然是一個(gè)類(lèi)屬性,但它卻可以通過(guò)實(shí)例的進(jìn)行賦值,且面對(duì)不同的 MathScore 實(shí)例 xiaoming、wangerma 的賦值和調(diào)用,并不會(huì)產(chǎn)生沖突!因此看起來(lái)似乎更類(lèi)似于 MathScore 的實(shí)例屬性,但與實(shí)例屬性不同的是它并不通過(guò) MathScore 實(shí)例的讀寫(xiě)方法操作值,而總是通過(guò) NonNegative 實(shí)例的 __get____set__ 對(duì)值進(jìn)行操作,那么它是怎么做到這點(diǎn)的?

注意看 __get____set__ 的參數(shù)

 def __get__(self, ist, cls):  #self:descriptor 實(shí)例本身(如 Math.score),ist:調(diào)用 score 的實(shí)例(如 xiaoming),cls:descriptor 實(shí)例所在的類(lèi)(如MathScore)
        ...

    def __set__(self, ist, value):  #score 就是通過(guò)這些傳入的 ist 、cls 參數(shù),實(shí)現(xiàn)對(duì) MathScore 及其具體實(shí)例屬性的調(diào)用和改寫(xiě)的
        ...

OK, 現(xiàn)在我們基本搞清了 descriptor 實(shí)例是如何實(shí)現(xiàn)對(duì)宿主類(lèi)的實(shí)例屬性進(jìn)行模擬的。事實(shí)上 Property 實(shí)例的實(shí)現(xiàn)方式與上面的 NonNegative 實(shí)例類(lèi)似。那么我們既然有了 Propery,為什么還要去自定義 descriptor 呢?

答案在于:更加逼真的模擬實(shí)例屬性(想想 MathScore.__init__里面那惡心的判斷語(yǔ)句),還有最重要的是:代碼重用!!!

簡(jiǎn)而言之:通過(guò)單個(gè) descriptor 對(duì)象,可以更加逼真的模擬實(shí)例屬性,并且可以實(shí)現(xiàn)對(duì)宿主類(lèi)實(shí)例的多個(gè)實(shí)例屬性進(jìn)行操作。

O.O! 如果你又秒懂了,那么你可以直接跳到下面寫(xiě)評(píng)論了...

看個(gè)栗子:假如不僅要判斷學(xué)生的分?jǐn)?shù)是否為負(fù)數(shù),而且還要判學(xué)生的學(xué)號(hào)是否為負(fù)值,使用 property 的實(shí)現(xiàn)方式是這樣子的:

class MathScore():
    
    def __init__(self, std_id, score):
        if std_id < 0:
            raise ValueError("Can"t be negative number!")
        self.__std_id = std_id
        if score < 0:
            raise ValueError("Can"t be negative number!")
        self.__score = score

    def check(self):
        if self.__score >= 60:
            return "pass"
        else:
            return "failed"            
    
    @property    
    def score(self):
        return self.__score
    
    @score.setter
    def score(self, value):
        if value < 0:
            raise ValueError("Can"t be negative number!")
        self.__score = value
    
    @property
    def std_id(self):
        return self.__std_id

    @std_id.setter
    def std_id(self, idnum):
        if idnum < 0:
            raise ValueError("Can"t be negative nmuber!")
        self.__std_id = idnum

Property 實(shí)例最大的問(wèn)題是:

無(wú)法影響宿主類(lèi)實(shí)例的初始化,所以咱必須在__init__ 加上那丑惡的 if ...

單個(gè) Property 實(shí)例僅能針對(duì)宿主類(lèi)實(shí)例的單個(gè)屬性,如果需要對(duì)多個(gè)屬性進(jìn)行控制,則必須定義多個(gè) Property 實(shí)例, 這真是太蛋疼了!

但是自定義 descriptor 可以很好的解決這個(gè)問(wèn)題,看下實(shí)現(xiàn):

class NonNegative():
    
    def __init__(self):
        self.dic = dict()

    def __get__(self, ist, cls):
        print("Description get", ist)
        return self.dic[ist]

    def __set__(self, ist, value):
        print("Description set", ist, value)
        if value < 0:
            raise ValueError("Can"t be negative number!")
        self.dic[ist] = value
        
class MathScore():
    
    score = NonNegative()    
    std_id = NonNegative()    
    
    def __init__(self, std_id, score):
        #這里并未創(chuàng)建實(shí)例屬性 std_id 和 score, 而是調(diào)用 MathScore.std_id 和 MathScore.score
        
        self.std_id = std_id
        self.score = score  
        
    def check(self):
        if self.score >= 60:
            return "pass"
        else:
            return "failed"     

哈哈~! MathScore.__init__ 內(nèi)終于沒(méi)了 if ,代碼也比上面的簡(jiǎn)潔不少,但是功能一個(gè)不少,且實(shí)例之間不會(huì)相互影響:

zhangsan = MathScore(12, 50)
Description set <__main__.MathScore object at 0x0000022E47C46D68> 12
Description set <__main__.MathScore object at 0x0000022E47C46D68> 50

lisi = MathScore(13, 90)
Description set <__main__.MathScore object at 0x0000022E47C46160> 13
Description set <__main__.MathScore object at 0x0000022E47C46160> 90

wangerma = MathScore(-13, 70)
Description set <__main__.MathScore object at 0x0000022E47C46DD8> -13


ValueError: Can"t be negative number!


zhangsan.score
Description get <__main__.MathScore object at 0x0000022E47C46D68>
Out[116]: 50

zhangsan.score = 80
Description set <__main__.MathScore object at 0x0000022E47C46D68> 80

lisi.score
Description get <__main__.MathScore object at 0x0000022E47C46160>
Out[118]: 90

事實(shí)上,MathScore 多個(gè)實(shí)例的同一個(gè)屬性,都是通過(guò)單個(gè) MathScore 類(lèi)的相應(yīng)類(lèi)屬性(也即 NonNegative 實(shí)例)操作的,這同 property 一致,但它又是怎么克服 Property 的兩個(gè)不足的呢?秘訣有三個(gè):

Property 實(shí)例本質(zhì)上是借助類(lèi)屬性,變向?qū)?shí)例屬性進(jìn)行操作,而 NonNegative 實(shí)例則是完全通過(guò)類(lèi)屬性模擬實(shí)例屬性,因此實(shí)例屬性其實(shí)根本不存在;

NonNegative 實(shí)例使用字典記錄每個(gè) MathScore 實(shí)例及其對(duì)應(yīng)的屬性值,其中 key 為 MathScore 實(shí)例名:比如 score 實(shí)例就是使用 dic = {‘Zhangsan’:50, ‘Lisi’:90} 記錄每個(gè)實(shí)例對(duì)應(yīng)的 score 值,從而確保可以實(shí)現(xiàn)對(duì) MathScore 實(shí)例屬性的模擬;

MathScore 通過(guò)在__init__內(nèi)直接調(diào)用類(lèi)屬性,從而實(shí)現(xiàn)對(duì)實(shí)例屬性初始化賦值的模擬,而 Property 則不可能,因?yàn)?Property 實(shí)例(也即MathScore的類(lèi)屬性)是真實(shí)的操作 MathScore 實(shí)例傳入的實(shí)例屬性以達(dá)到目的,但如果在初始化程序中傳入的不是實(shí)例屬性,而是類(lèi)屬性(也即 Property 實(shí)例本身),則會(huì)陷入無(wú)限遞歸(PS:想一下如果將前一個(gè)property 實(shí)例實(shí)現(xiàn)中的self.__score 改成這里的 self.score 會(huì)發(fā)生什么)。

這三點(diǎn)看的似懂非懂,沒(méi)關(guān)系,來(lái)個(gè)比喻:

每個(gè) descriptor 實(shí)例(MathScore.score 和 MathScore.std_id)都是類(lèi)作用域里的一個(gè)籃子,籃子里放著寫(xiě)著每個(gè) MathScore 實(shí)例名字的盒子(‘zhangsan’,’lisi‘),同一個(gè)籃子里的盒子只記錄同樣屬性的值(比如score籃子里的盒子只記錄分?jǐn)?shù)值),當(dāng) MathScore 的實(shí)例對(duì)相應(yīng)屬性進(jìn)行操作時(shí),則找到對(duì)應(yīng)的籃子,取出標(biāo)有該實(shí)例名字的盒子,并對(duì)其進(jìn)行操作。

因此,實(shí)例對(duì)應(yīng)的屬性,壓根不在實(shí)例自己的作用域內(nèi),而是在類(lèi)作用域的籃子里,只不過(guò)我們可以通過(guò) xiaoming.score 這樣的方式進(jìn)行操作而已,所以其實(shí)際的調(diào)用的邏輯是這樣的:下圖右側(cè)的實(shí)例分別通過(guò)紅線和黑線對(duì)score和std_id 進(jìn)行操作,他們首先通過(guò)類(lèi)調(diào)用相應(yīng)的類(lèi)屬性,然后類(lèi)屬性通過(guò)對(duì)應(yīng)的 descriptor 實(shí)例作用域?qū)Σ僮鬟M(jìn)行處理,并返回給類(lèi)屬性相應(yīng)結(jié)果,最后讓實(shí)例感知到。

看到這里,很多童鞋可能不淡定了,因?yàn)榇蠹叶贾涝?Python 中采取 xiaoming.score = 10 這樣的賦值方式,如果 xiaoming 沒(méi)有 score 這樣的實(shí)例屬性,必定會(huì)自動(dòng)創(chuàng)建該實(shí)例屬性,怎么會(huì)去調(diào)用 MathScore 的 score 呢?

首先,要鼓掌!!! 給想到這點(diǎn)的童鞋點(diǎn)贊!!!其實(shí)上面在說(shuō) Property 的時(shí)候這個(gè)問(wèn)題就產(chǎn)生了。

其次,Python 為了實(shí)現(xiàn) discriptor 確實(shí)對(duì)屬性的調(diào)用順序做出了相應(yīng)的調(diào)整,這些將會(huì)“Python 的 descriptor(下)”中介紹。

參考資料

1、如何理解 Python 的 Descriptor?
2、python中基于descriptor的一些概念(上)
3、python中基于descriptor的一些概念(下)
4、descriptor 的官方文檔
5、Python描述符(descriptor)解密
6、class property 的官方文檔

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/37766.html

相關(guān)文章

  • 如何正確地使用Python屬性和描述符

    摘要:描述符登場(chǎng)什么是描述符一般來(lái)說(shuō),描述符是一個(gè)具有綁定行為的對(duì)象屬性,其屬性的訪問(wèn)被描述符協(xié)議方法覆寫(xiě)。先看如何用描述符來(lái)解決上面邏輯重復(fù)的問(wèn)題。 關(guān)于@property裝飾器 在Python中我們使用@property裝飾器來(lái)把對(duì)函數(shù)的調(diào)用偽裝成對(duì)屬性的訪問(wèn)。 那么為什么要這樣做呢?因?yàn)锧property讓我們將自定義的代碼同變量的訪問(wèn)/設(shè)定聯(lián)系在了一起,同時(shí)為你的類(lèi)保持一個(gè)簡(jiǎn)單的訪問(wèn)...

    huayeluoliuhen 評(píng)論0 收藏0
  • Programming Computer Vision with Python (學(xué)習(xí)筆記十二)

    摘要:圖像矩圖像矩或稱(chēng)幾何矩是由在年提出的。矩給出了對(duì)圖像形狀的一種度量。使用建議的第二種采樣方法即以圖像中心進(jìn)行高斯分布采樣,長(zhǎng)度使用,然后在基礎(chǔ)上增加了旋轉(zhuǎn)的描述以及快速的計(jì)算方法,這種方法被稱(chēng)為。 ORB(Oriented FAST and Rotated BRIEF)可用來(lái)替代SIFT(或SURF),它對(duì)圖像更具有抗噪特性,是一種特征檢測(cè)高效算法,其速度滿(mǎn)足實(shí)時(shí)要求,可用于增強(qiáng)圖像匹...

    xbynet 評(píng)論0 收藏0
  • JS 裝飾器,一篇就夠

    摘要:的裝飾器中的同樣借鑒了這個(gè)語(yǔ)法糖,不過(guò)依賴(lài)于的方法。等同于也就是說(shuō),裝飾器是一個(gè)對(duì)類(lèi)進(jìn)行處理的函數(shù)。別名或裝飾器在控制臺(tái)顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫(xiě)上面的代碼。 更多文章,請(qǐng)?jiān)贕ithub blog查看 在 ES6 中增加了對(duì)類(lèi)對(duì)象的相關(guān)定義和操作(比如 class 和 extends ),這就使得我們?cè)诙鄠€(gè)不同類(lèi)之間共享或者擴(kuò)展一些方法或者行為的時(shí)候,變得并...

    learning 評(píng)論0 收藏0
  • python 屬性搜索優(yōu)先級(jí)和descriptor

    摘要:屬性搜索優(yōu)先級(jí)和定義數(shù)據(jù)描述符數(shù)據(jù)描述符非數(shù)據(jù)描述符一般情況數(shù)據(jù)型描述符非數(shù)據(jù)型描述符類(lèi)調(diào)用描述符如果被重寫(xiě)上面代碼介紹的東西會(huì)被覆蓋掉除非函數(shù)內(nèi)部調(diào)用否則別這么干例子 屬性搜索優(yōu)先級(jí)和descriptor ######################## # 定義 ######################## # 數(shù)據(jù)描述符 class DataDesc(object): ...

    NusterCache 評(píng)論0 收藏0
  • opencv python 特征匹配

    摘要:匹配器匹配非常簡(jiǎn)單,首先在第一幅圖像中選取一個(gè)關(guān)鍵點(diǎn)然后依次與第二幅圖像的每個(gè)關(guān)鍵點(diǎn)進(jìn)行描述符距離測(cè)試,最后返回距離最近的關(guān)鍵點(diǎn)對(duì)于匹配器,首先我們必須使用創(chuàng)建對(duì)象。 Feature Matching Brute-Force匹配器 Brute-Force匹配非常簡(jiǎn)單,首先在第一幅圖像中選取一個(gè)關(guān)鍵點(diǎn)然后依次與第二幅圖像的每個(gè)關(guān)鍵點(diǎn)進(jìn)行(描述符)距離測(cè)試,最后返回距離最近的關(guān)鍵點(diǎn). 對(duì)于...

    macg0406 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<