python函數重寫怎麼理解

爱喝马黛茶的安东尼
發布: 2019-06-25 15:43:33
原創
4091 人瀏覽過

在自訂類別內加入對應的方法,讓自訂類別建立的實例能像內建物件一樣進行內建函數操作,這就是函數重寫。

物件轉字串函數:repr(obj) ,傳回一個能代表此物件的表達式字串,通常eval(repr(obj)) == obj  (這個字串通常是給python解釋執行器運作用的),str(obj)  透過給定的物件傳回一個字串(這個字串通常是給人閱讀的)。

python函數重寫怎麼理解

物件轉字串函數的重寫方法:

#repr(obj) 函數的重寫方法:

def __repr__(self):
登入後複製

str(obj) 函數的重寫方法:

def __str__(self):
登入後複製

說明:

1. str(obj) 函數先找出, obj. __str__()方法,呼叫此方法並傳回結果

2. 如果沒有obj.__str__()方法時,則傳回obj.__repr__()方法的結果並傳回

#3. 如果obj.__repr__方法不存在,則呼叫object類別的__repr__實例方法顯示<__main__.XXXX object at 0xAABBCCDD>格式的字串

#範例:

# 此示例示意通过重写 repr 和 str方法改变转为字符串的规则
class MyNumber:
    def __init__(self, value):
        &#39;构造函数,初始化MyNumber对象&#39;
        self.data = value
 
    def __str__(self):
        &#39;&#39;&#39;转换为普通人识别的字符串&#39;&#39;&#39;
        # print("__str__方法被调用!")
        return "自定义数字类型对象: %d" % self.data
 
    def __repr__(self):
        &#39;&#39;&#39;转换为eval能够识别的字符串&#39;&#39;&#39;
        return &#39;MyNumber(%d)&#39; % self.data
 
 
n1 = MyNumber(100)
n2 = MyNumber(200)
print(&#39;repr(n1) ====>&#39;, repr(n1))
print(&#39;str(n2)  ====>&#39;, str(n2))
登入後複製

相關建議:《Python視訊教學

其它內建函數的重寫方法:

  __abs__       abs(obj)  函數

  __len__       len(obj)  函數(必須回傳整數)

  __reversed__  reversed(obj) 函數(必須傳回可迭代物件

o__o#cfound

範例:

# 此示例示意abs 函数的重写
class MyInteger:
 
    def __init__(self, v):
        self.data = v
 
    def __repr__(self):
        return &#39;MyInteger(%d)&#39; % self.data
 
    def __abs__(self):
        v = abs(self.data)
        return MyInteger(v)  # 用v创建另一个MyInteger对象
 
    def __len__(self):
        return 10000
 
I1 = MyInteger(-10)
print(&#39;I1 =&#39;, I1)
 
I2 = abs(I1)
print("I2 =", I2)
 
print(&#39;len(I2)=&#39;, len(I2))  # 10000
登入後複製

數值轉換函數的重寫:

  __complex__  complex(obj) 函數

  __int__ int(obj) 函數

  __float__    float(obj) 函數

  __bool__     bool(obj) 函數    # (請參閱下方布林測試函數重載)

##
# 此示例示意数据转换构造函数的重写方法
class MyNumber:
 
    def __init__(self, value):
        self.data = value
 
    def __repr__(self):
        return &#39;MyNumber(%d)&#39; % self.data
 
    def __int__(self):
        &#39;int函数的重载&#39;
        return self.data
 
n1 = MyNumber(100)
x = int(n1)
print(n1)
 
print(bool(n1))  # True
n2 = MyNumber(0)
print(bool(n2))  # True
登入後複製

布林測試函數重寫:

#格式:

    __bool__

#作用:

    用於bool(obj) 函數取值

    用於if語句的真值運算式中    用於while 語句的真值表達式中

說明:

    1. 當自訂的類別內有__bool__(self) 方法時,以此方法的回傳值作為bool(obj ) 的回傳值

    2. 當不存在__bool__(self) 方法時,bool(x) 傳回__len__(self) 方法的傳回值是否為零來測試布林值# 3. 當不存在__len__(self) 方法時,則直接傳回True

#範例:

# 此示例示意bool(x) 函数的重写
class MyList:
    &#39;自定义类型的列表,用来保存数据,内部用一个列表来存储数据&#39;
 
    def __init__(self, iterable=()):
        self.data = [x for x in iterable]
 
    def __repr__(self):
        return &#39;MyList(%s)&#39; % self.data
 
    def __len__(self):
        &#39;&#39;&#39;返回长度&#39;&#39;&#39;
        print("__len__方法被调用")
        return len(self.data)
 
    def __bool__(self):
        print("__bool__方法调用")
        for x in self.data:
            if not x:
                return False
        return True
        # return False  # <<=== 所有对象都为False
 
myl = MyList([0, -1, 2, -3])
# myl = MyList()
print(myl)
print(bool(myl))
if myl:
    print("myl为真值")
else:
    print(&#39;myl为假值&#39;)
登入後複製

以上是python函數重寫怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板