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

資訊專欄INFORMATION COLUMN

python中的魔術方法__

SegmentFault / 1248人閱讀

摘要:在任何新式類的方法,不能調用自身的來制造實例,因為這會造成死循環。因此必須避免類似以下的寫法在中避免或。注意如果沒有返回即當前類的實例,那么當前類的方法是不會被調用的。是最基本的用于比較的魔術方法。

1、__ new__, __ init__, __ call__
__ new__(cls, *args, **kwargs) 創建對象時調用,返回當前對象的一個實例;注意:這里的第一個參數是cls即class本身
__ init__(self, *args, **kwargs) 創建完對象后調用,對當前對象的實例的一些初始化,無返回值,即在調用__new__之后,根據返回的實例初始化;注意,這里的第一個參數是self即對象本身
__ call__(self, *args, **kwargs) 如果類實現了這個方法,相當于把這個類型的對象當作函數來使用,相當于 重載了括號運算符

繼承自object的新式類才有__ new__
__ new__至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供

__ new__必須要有返回值,返回實例化出來的實例,這點在自己實現_ new__時要特別注意,可以return父類__ new__出來的實例,或者直接是object的 _new__出來的實例

__ init__有一個參數self,就是這個 __ new__返回的實例,__ init__在__ new__的基礎上可以完成一些其它初始化的動作,__ init__不需要返回值

若_ _new__沒有正確返回當前類cls的實例,那__ init__是不會被調用的,即使是父類的實例也不行

http://www.cnblogs.com/ifantastic/p/3175735.html

class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)    

# 以上return等同于 
# return object.__new__(Foo, *args, **kwargs)
# return Stranger.__new__(cls, *args, **kwargs)
# return Child.__new__(cls, *args, **kwargs)

class Child(Foo):
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)

# 如果Child中沒有定義__new__()方法,那么會自動調用其父類的__new__()方法來制造實例,即 Foo.__new__(cls, *args, **kwargs)。
# 在任何新式類的__new__()方法,不能調用自身的__new__()來制造實例,因為這會造成死循環。因此必須避免類似以下的寫法:
# 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。
# 使用object或者沒有血緣關系的新式類的__new__()是安全的,但是如果是在有繼承關系的兩個類之間,應避免互調造成死循環,例如:(Foo)return Child.__new__(cls), (Child)return Foo.__new__(cls)。

class Stranger(object):
    ...
# 在制造Stranger實例時,會自動調用 object.__new__(cls)
也可以這么調用
new_class = super(RenameMethodsBase, cls).__new__(cls, name, bases, attrs)
  

通常來說,新式類開始實例化時,new()方法會返回cls(cls指代當前類)的實例,然后該類的init()方法作為構造方法會接收這個實例(即self)作為自己的第一個參數,然后依次傳入new()方法中接收的位置參數和命名參數。

注意:如果new()沒有返回cls(即當前類)的實例,那么當前類的init()方法是不會被調用的。如果new()返回其他類(新式類或經典類均可)的實例,那么只會調用被返回的那個類的構造方法。

class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(Stranger, *args, **kwargs)  

class Stranger(object):
    ...

foo = Foo()
print type(foo)    

# 打印的結果顯示foo其實是Stranger類的實例。

# 因此可以這么描述__new__()和__ini__()的區別,在新式類中__new__()才是真正的實例化方法,為類提供外殼制造出實例框架,然后調用該框架內的構造方法__init__()使其豐滿。
# 如果以建房子做比喻,__new__()方法負責開發地皮,打下地基,并將原料存放在工地。而__init__()方法負責從工地取材料建造出地皮開發招標書中規定的大樓,__init__()負責大樓的細節設計,建造,裝修使其可交付給客戶。

2、__ del__
它不實現語句 del x (以上代碼將不會翻譯為 x.__ del__() )。它定義的是當一個對象進行垃圾回收時候的行為。當一個對象在刪除的時需要更多的清潔工作的時候此方法會很有用,比如套接字對象或者是文件對象。注意,如果解釋器退出的時候對象還存存在,就不能保證 __ del__ 能夠被執行

from os.path import join

class FileObject:
    """給文件對象進行包裝從而確認在刪除時文件流關閉"""

    def __init__(self, filepath="~", filename="sample.txt"):
        #讀寫模式打開一個文件
        self.file = open(join(filepath, filename), "r+")

    def __del__(self):
        self.file.close()
        del self.file

3、用于比較的魔術方法

Python對實現對象的比較,使用魔術方法進行了大的逆轉,使他們非常直觀而不是笨拙的方法調用。
而且還提供了一種方法可以重寫Python對對象比較的默認行為(通過引用)。以下是這些方法和他們的作用。

__cmp__(self, other) __cmp__ 是最基本的用于比較的魔術方法。它實際上實現了所有的比較符號(<,==,!=,etc.),但是它的表現并不會總是如你所愿(比如,當一個實例與另一個實例相等是通過一個規則來判斷,而一個實例大于另外一個實例是通過另外一個規則來判斷)。
如果 self < other 的話 __cmp__ 應該返回一個負數,當 self == other 的時候會返回0 ,而當 self > other 的時候會返回正數。通常最好的一種方式是去分別定義每一個比較符號而不是一次性將他們都定義。
但是 __cmp__ 方法是你想要實現所有的比較符號而一個保持清楚明白的一個好的方法。

__eq__(self, other) 定義了等號的行為, == 。

__ne__(self, other) 定義了不等號的行為, != 。

__lt__(self, other) 定義了小于號的行為, < 。

__gt__(self, other) 定義了大于等于號的行為, >= 。

class Word(str):
"""存儲單詞的類,定義比較單詞的幾種方法"""

    def __new__(cls, word):
        # 注意我們必須要用到__new__方法,因為str是不可變類型
        # 所以我們必須在創建的時候將它初始化
        if " " in word:
            print "Value contains spaces. Truncating to first space."
            word = word[:word.index(" ")] #單詞是第一個空格之前的所有字符
        return str.__new__(cls, word)

    def __gt__(self, other):
        return len(self) > len(other)
    def __lt__(self, other):
        return len(self) < len(other)
    def __ge__(self, other):
        return len(self) >= len(other)
    def __le__(self, other):
        return len(self) <= len(other)

http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/a-guid...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37574.html

相關文章

  • 介紹Python魔術方法 - Magic Method

    摘要:所以準確來說是和共同構成了構造函數是用來創建類并返回這個類的實例而只是將傳入的參數來初始化該實例在創建一個實例的過程中必定會被調用但就不一定,比如通過的方式反序列化一個實例時就不會調用。 前言 在Python中,所有以__雙下劃線包起來的方法,都統稱為魔術方法。比如我們接觸最多的__init__. 有些魔術方法,我們可能以后一輩子都不會再遇到了,這里也就只是簡單介紹下; 而有些魔術方法...

    animabear 評論0 收藏0
  • python學習筆記-魔術方法,讓自定義類更像內置類型

    摘要:的魔術方法是中那些預定義的像類型的函數。使用的魔術方法的最大優勢在于提供了簡單的方法讓對象可以表現得像內置類型一樣。廖雪峰老師教程里寫的是方法,不知道為啥。 Python的魔術方法是Python中那些預定義的像__XXX__類型的函數。使用Python的魔術方法的最大優勢在于python提供了簡單的方法讓對象可以表現得像內置類型一樣。 __str__函數 __str__函數用于處理打印...

    changfeng1050 評論0 收藏0
  • Python魔術方法做出更好的正則表達式 API

    摘要:注原文地址為我的一個同事提到他錯過了的正則表達式的語法糖。首先,從正則表達式檢索捕捉組需要兩個步驟。語法糖為了好玩,我把一個小小的增加了一些語法糖的正則表達式庫的幫助類放在一起。調用將調用類的方法。 注:原文地址為 Playing with Python Magic Methods to make a nicer Regex API 我的一個同事提到,他錯過了 Ruby 的正...

    MangoGoing 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<