亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python魔法方法-屬性轉(zhuǎn)換和類(lèi)的表示詳解

 更新時(shí)間:2016年07月22日 08:56:07   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇python魔法方法-屬性轉(zhuǎn)換和類(lèi)的表示詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

類(lèi)型轉(zhuǎn)換魔法

類(lèi)型轉(zhuǎn)換魔法其實(shí)就是實(shí)現(xiàn)了str、int等工廠函數(shù)的結(jié)果,通常這些函數(shù)還有類(lèi)型轉(zhuǎn)換的功能,下面是一些相關(guān)的魔法方法:

•__int__(self)

•轉(zhuǎn)換成整型,對(duì)應(yīng)int函數(shù)。

•__long__(self)

•轉(zhuǎn)換成長(zhǎng)整型,對(duì)應(yīng)long函數(shù)。

•__float__(self)

•轉(zhuǎn)換成浮點(diǎn)型,對(duì)應(yīng)float函數(shù)。

•__complex__(self)

•轉(zhuǎn)換成 復(fù)數(shù)型,對(duì)應(yīng)complex函數(shù)。

•__oct__(self)

•轉(zhuǎn)換成八進(jìn)制,對(duì)應(yīng)oct函數(shù)。

•__hex__(self)

•轉(zhuǎn)換成十六進(jìn)制,對(duì)應(yīng)hex函數(shù)。

•__index__(self)

•首先,這個(gè)方法應(yīng)該返回一個(gè)整數(shù),可以是int或者long。這個(gè)方法在兩個(gè)地方有效,首先是 operator 模塊中的index函數(shù)得到的值就是這個(gè)方法的返回值,其次是用于切片操作,下面會(huì)專(zhuān)門(mén)進(jìn)行代碼演示。

•__trunc__(self)

•當(dāng) math.trunc(self) 使用時(shí)被調(diào)用.__trunc__返回自身類(lèi)型的整型截取 (通常是一個(gè)長(zhǎng)整型).

•__coerce__(self, other)

•實(shí)現(xiàn)了類(lèi)型的強(qiáng)制轉(zhuǎn)換,這個(gè)方法對(duì)應(yīng)于 coerce 內(nèi)建函數(shù)的結(jié)果(python3.0開(kāi)始去掉了此函數(shù),也就是該魔法方法也沒(méi)意義了,至于后續(xù)的版本是否重新加入支持,要視官方而定。)

•這個(gè)函數(shù)的作用是強(qiáng)制性地將兩個(gè)不同的數(shù)字類(lèi)型轉(zhuǎn)換成為同一個(gè)類(lèi)型,例如:

方法返回一個(gè)元祖,分別對(duì)應(yīng)轉(zhuǎn)換后的兩個(gè)數(shù)字。其優(yōu)先級(jí)為:復(fù)數(shù)>浮點(diǎn)數(shù)>長(zhǎng)整型>整型。在轉(zhuǎn)換的時(shí)候,會(huì)轉(zhuǎn)換為兩個(gè)參數(shù)中優(yōu)先級(jí)高的類(lèi)型。當(dāng)轉(zhuǎn)換無(wú)法完成的時(shí)候,會(huì)觸發(fā) TypeError。

而當(dāng)我們定義這個(gè)魔法方法時(shí),如果轉(zhuǎn)換無(wú)法完成,應(yīng)該返回None。

這里有個(gè)重要的機(jī)制,當(dāng)python進(jìn)行運(yùn)算的時(shí)候,如 1 + 1.0 時(shí),會(huì)先調(diào)用 coerce 函數(shù)將其轉(zhuǎn)換為同一個(gè)類(lèi)型,然后再進(jìn)行運(yùn)行,這也就是為什么 1 + 1.0 = 2.0,因?yàn)檗D(zhuǎn)換之后實(shí)際進(jìn)行的運(yùn)算為 1.0 +1.0。得到這樣的結(jié)果也就不奇怪了。

代碼示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return int(self.x) + 1

  def __long__(self):
    return long(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

這里要注意一點(diǎn),魔法方法的返回值必須符合預(yù)期,例如 __int__ 就應(yīng)該返回一個(gè) int 類(lèi)型,如果我們?nèi)涡缘胤祷仄渌?lèi)型,例如字符串(str)、列表(list)等,會(huì)報(bào)錯(cuò)。

def __int__(self):
    return str(self.x)

def __int__(self):
    return list(self.x)

但是 int 可以返回 long,而 long 返回 int 時(shí)會(huì)自動(dòng)被處理成 long:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return long(self.x) + 1

  def __long__(self):
    return int(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

以上發(fā)生在python2.7.11上,這是一個(gè)很奇怪的行為,以至于我認(rèn)為其可能是一個(gè) BUG,總之我們?cè)谑褂玫臅r(shí)候要注意要返回對(duì)應(yīng)的類(lèi)型就是了,以免出錯(cuò)。

__index__(self):

首先是對(duì)應(yīng)于operator.index(),operator.index(a)就相當(dāng)于a.__index__():

import operator

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return self.x + 1

a = Foo(10)
print operator.index(a)

另一個(gè)是很神奇的特效,當(dāng)其用于序列中時(shí):

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return 3

a = Foo('scolia')
b = [1, 2, 3, 4, 5]
print b[a]
print b[3]

可以作為索引一樣使用,可進(jìn)行切片操作:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return int(self.x)

a = Foo('1')
b = Foo('3')
c = [1, 2, 3, 4, 5]
print c[a:b]

 

其實(shí)切片內(nèi)部使用的函數(shù) slice 對(duì)其進(jìn)行了處理,有興趣的同學(xué)可以去了解這個(gè)函數(shù):

a = Foo('1')
b = Foo('3')
c = slice(a, b)
print c
d = [1, 2, 3, 4, 5]
print d[c]

 __coerce__(self, other):

代碼示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, str(other.x)

class Boo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, int(other.x)

a = Foo('123')
b = Boo(123)
print coerce(a, b)
print coerce(b, a)

 總結(jié):是調(diào)用了第一個(gè)參數(shù)的魔法方法。

類(lèi)的表示 :

類(lèi)的表示其實(shí)就是對(duì)外的特征,例如使用print語(yǔ)句時(shí),打印出來(lái)的是什么,其實(shí)本質(zhì)上也是對(duì)應(yīng)函數(shù)的輸出:

•__str__(self)

•定義當(dāng) str() 被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。因?yàn)閜rint默認(rèn)調(diào)用的就是str()函數(shù)。

•__repr__(self)

•定義當(dāng) repr()  被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。 str() 和 repr() 的主要區(qū)別是其目標(biāo)群體。 repr() 返回的是機(jī)器可讀的輸出,而 str() 返回的是人類(lèi)可讀的。  repr() 函數(shù)是交換模式默認(rèn)調(diào)用的

•函數(shù)。

•__unicode__(self)

•定義當(dāng) unicode() 被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。 unicode() 和 str() 很相似,但是返回的是unicode字符串。注意,如果對(duì)你的類(lèi)調(diào)用 str() 然而你只定義了 __unicode__() ,那么其將不會(huì)

•工作。你應(yīng)該定義 __str__() 來(lái)確保調(diào)用時(shí)能返回正確的值,并不是每個(gè)人都有心情去使用unicode()。

•__format__(self, formatstr)

•定義當(dāng)你的一個(gè)類(lèi)的實(shí)例被用來(lái)用新式的格式化字符串方法進(jìn)行格式化時(shí)所要產(chǎn)生的行為。例如, "Hello, {0:abc}!".format(a) 將會(huì)導(dǎo)致調(diào)用 a.__format__("abc") 。這對(duì)定義你自己的數(shù)值或字符串類(lèi)型

•是十分有意義的,你可能會(huì)給出一些特殊的格式化選項(xiàng)。

•__hash__(self)

•定義當(dāng) hash()被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。它必須返回一個(gè)整數(shù),用來(lái)在字典中進(jìn)行快速比較。

•請(qǐng)注意,實(shí)現(xiàn)__hash__時(shí)通常也要實(shí)現(xiàn)__eq__。有下面這樣的規(guī)則:a == b 暗示著 hash(a) == hash(b) 。也就是說(shuō)兩個(gè)魔法方法的返回值最好一致。

•這里引入一個(gè)‘可哈希對(duì)象'的概念,首先一個(gè)可哈希對(duì)象的哈希值在其生命周期內(nèi)應(yīng)該是不變的,而要得到哈希值就意味要實(shí)現(xiàn)__hash__方法。而哈希對(duì)象之間是可以比較的,這意味著要實(shí)現(xiàn)__eq__或

•者_(dá)_cmp__方法,而哈希對(duì)象相等必須其哈希值相等,要實(shí)現(xiàn)這個(gè)特性就意味著__eq__的返回值必須和__hash__一樣。

•可哈希對(duì)象可以作為字典的鍵和集合的成員,因?yàn)檫@些數(shù)據(jù)結(jié)構(gòu)內(nèi)部使用的就是哈希值。python中所有內(nèi)置的不變的對(duì)象都是可哈希的,例如元組、字符串、數(shù)字等;而可變對(duì)象則不能哈希,例如列表、

•字典等。

•用戶(hù)定義的類(lèi)的實(shí)例默認(rèn)是可哈希的,且除了它們本身以外誰(shuí)也不相等,因?yàn)槠涔V祦?lái)自于 id 函數(shù)。但這并不代表 hash(a) == id(a),要注意這個(gè)特性。

•__nonzero__(self)

•定義當(dāng) bool() 被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。本方法應(yīng)該返回True或者False,取決于你想讓它返回的值。(python3.x中改為_(kāi)_bool__)

•__dir__(self)

•定義當(dāng) dir() 被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。該方法應(yīng)該返回一個(gè)屬性的列表給用戶(hù)。

•__sizeof__(self)

•定義當(dāng) sys.getsizeof() 被你的一個(gè)類(lèi)的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。該方法應(yīng)該以字節(jié)為單位,返回你的對(duì)象的大小。這通常對(duì)于以C擴(kuò)展的形式實(shí)現(xiàn)的Python類(lèi)更加有意義,其有助于理解這些擴(kuò)展。

這里并沒(méi)有什么特別難以理解的地方,所以代碼例子就略去了。

以上這篇python魔法方法-屬性轉(zhuǎn)換和類(lèi)的表示詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失

    解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失

    這篇文章主要介紹了解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python中JSON常見(jiàn)用法(json.load()、json.loads()、json.dump()、json.dumps())

    Python中JSON常見(jiàn)用法(json.load()、json.loads()、json.dump()、json.du

    本文主要介紹了Python中JSON常見(jiàn)用法(json.load()、json.loads()、json.dump()、json.dumps()),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python爬蟲(chóng)框架之Scrapy中Spider的用法

    Python爬蟲(chóng)框架之Scrapy中Spider的用法

    今天給大家?guī)?lái)的是關(guān)于Python爬蟲(chóng)的相關(guān)知識(shí),文章圍繞著Scrapy中Spider的用法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題

    解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題

    下面小編就為大家?guī)?lái)一篇解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Python內(nèi)建類(lèi)型float源碼學(xué)習(xí)

    Python內(nèi)建類(lèi)型float源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python內(nèi)建類(lèi)型float源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python 圖片文字識(shí)別的實(shí)現(xiàn)之PaddleOCR

    Python 圖片文字識(shí)別的實(shí)現(xiàn)之PaddleOCR

    OCR方向的工程師,之前一定聽(tīng)說(shuō)過(guò)PaddleOCR這個(gè)項(xiàng)目,其主要推薦的PP-OCR算法更是被國(guó)內(nèi)外企業(yè)開(kāi)發(fā)者廣泛應(yīng)用,短短半年時(shí)間,累計(jì)Star數(shù)量已超過(guò)15k,頻頻登上Github Trending和Paperswithcode 日榜月榜第一
    2021-11-11
  • 一文解密Python中的垃圾回收

    一文解密Python中的垃圾回收

    我們知道,python?是一種高級(jí)編程語(yǔ)言,它提供了自動(dòng)內(nèi)存管理的功能,即垃圾回收機(jī)制,所以本文就來(lái)聊聊python的垃圾回收機(jī)制是如何實(shí)現(xiàn)的以及具體是使用,感興趣的可以了解下
    2023-09-09
  • python skimage 連通性區(qū)域檢測(cè)方法

    python skimage 連通性區(qū)域檢測(cè)方法

    今天小編就為大家分享一篇python skimage 連通性區(qū)域檢測(cè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖

    Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖

    這篇文章主要介紹了Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Python和OpenCV進(jìn)行多尺度模板匹配實(shí)現(xiàn)

    Python和OpenCV進(jìn)行多尺度模板匹配實(shí)現(xiàn)

    本文將實(shí)現(xiàn)如何將標(biāo)準(zhǔn)模板匹配擴(kuò)展到多尺度,使其可以處理模板和輸入圖像大小不同的匹配。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論