python第42課練習—魔法方法:算術運算

1忽你、自Python2.2以后幼东,對類和類型進行了統(tǒng)一,做法就是將int()科雳、float()根蟹、str()、list()糟秘、tuple()這些BIF轉換為工廠函數简逮。請問所謂的工廠函數,其實是什么原理尿赚?

答:工廠函數散庶,其實就是一個類對象蕉堰。當你調用他們的時候,事實上就是創(chuàng)建一個相應的實例對象悲龟。

# a 和 b 是工廠函數(類對象)int的實例對象
>>> a = int('123')
>>> b = int('345')
>>> a + b
468

2屋讶、當實例對象進行加法操作時,會自動調用什么魔法方法须教?

答:對象a和b相加時(a+b)皿渗,Python會自動根據對象a的__add__魔法方法進行加法操作。

3轻腺、下邊的代碼有問題嗎乐疆?(運行起來似乎沒出錯呀)

class Foo:
    def foo(self):
        self.foo = 'I love FishC.com'
        return self.foo

>>> foo = Foo()
>>> foo.foo()
'I love FishC.com'

答:這絕對是一個溫柔的陷阱,這種bug比較難以排查贬养,所以一定要注意:類的屬性名和方法名絕對不能相同挤土!如果代碼這么寫,就會有一個難以排查的bug出現了:

class Foo:
    def __init__(self):
        self.foo = 'I love FishC.com'
    def foo(self):
        return self.foo

    
>>> foo = Foo()
>>> foo.foo()
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    foo.foo()
TypeError: 'str' object is not callable

4误算、寫出下列運算符對應的魔法方法仰美。

運算符 對應的魔法方法
+ __add__(self,other)
- __sub__(self,other)
* __mul__(self,other)
/ __truediv__(self,other)
// __floordiv__(self,other)
% __mod__(self,other)
divmod(a,b) __divmod__(a,b)
** __pow__(self,other[,modulo])
<< __lshift__(self,other)
>> __rshift__(self,other)
& __and__(self,other)
^ __xor__(self,other)
| __or__(self,other)

5、以下代碼說明Python支持什么風格尉桩?

def calc(a,b,c):
    return (a + b) * c

>>> a = calc(1,2,3)
>>> b = calc([1,2,3,],[4,5,6],2)
>>> c = calc('love','FishC',3)
>>> print(a)
9
>>> print(b)
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
>>> print(c)
loveFishCloveFishCloveFishC

答:說明Python支持鴨子類型(duck typing)風格筒占。

練習

1、我們都知道在Python中蜘犁,兩個字符串相加會拼接字符串翰苫,但遺憾的是兩個字符串相減卻會拋出異常。因此这橙,現在我們要求定義一個Nstr類奏窑,支持字符串的相減操作:A-B,從A中去除所有B的子字符串屈扎。

示例:

>>> a = Nstr('I love FishC.com!iiiiiiii')
>>> b = Nstr('i')
>>> a - b
'I love FshC.com!'

答:只需要重載__sub__魔法方法即可埃唯。

class Nstr(str):
    def __sub__(self,other):
        return self.replace(other,'')

2、移位操作符是應用于二進制操作數的鹰晨,現在需要你定義一個新的類Nstr墨叛,也支持移位操作符的運算:

>>> a = Nstr('I love FishC.com!' )
>>> a << 3
'ove FishC.com!I l'
>>> a >> 3
'I love FishC.com!'

答:只需要重載__lshift__和__rshift__魔法方法即可。

class Nstr(str):
    def __lshift__(self,other):
        return self[other:] + self[:other]
    def __rshift__(self,other):
        return self[:-other] + self[-other:]

3模蜡、定義一個類Nstr,當該類的實例對象間發(fā)生的加漠趁、減、乘忍疾、除運算時闯传,將對象所有字符串的ASCⅡ碼之和進行計算:

>>> a = Nstr('FishC')
>>> b = Nstr('love')
>>> a + b
899
>>> a - b
23
>>> a * b
201918
>>> a / b
1.052511415525114
>>> a // b
1

代碼清單:

class Nstr:
    def __init__(self,arg=''):
        if isinstance(arg,str):
            self.total = 0
            for each in arg:
                self.total += ord(each)
        else:
            print('參數錯誤!')

    def __add__(self,other):
        return self.total + other.total

    def __sub__(self,other):
        return self.total - other.total

    def __mul__(self,other):
        return self.total * other.total
    def __truediv__(self,other):
        return self.total / other.total
    def __floordiv__(self,other):
        return self.total // other.total
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末卤妒,一起剝皮案震驚了整個濱河市甥绿,隨后出現的幾起案子字币,更是在濱河造成了極大的恐慌,老刑警劉巖共缕,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洗出,死亡現場離奇詭異,居然都是意外死亡骄呼,警方通過查閱死者的電腦和手機共苛,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門判没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓萄,“玉大人,你說我怎么就攤上這事澄峰〖倒粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵俏竞,是天一觀的道長绸硕。 經常有香客問我,道長魂毁,這世上最難降的妖魔是什么玻佩? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮席楚,結果婚禮上咬崔,老公的妹妹穿的比我還像新娘。我一直安慰自己烦秩,他們只是感情好垮斯,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只祠,像睡著了一般兜蠕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抛寝,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天熊杨,我揣著相機與錄音,去河邊找鬼盗舰。 笑死晶府,一個胖子當著我的面吹牛,可吹牛的內容都是我干的岭皂。 我是一名探鬼主播郊霎,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爷绘!你這毒婦竟也來了书劝?” 一聲冷哼從身側響起进倍,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎购对,沒想到半個月后猾昆,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡骡苞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年垂蜗,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解幽。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贴见,死狀恐怖,靈堂內的尸體忽然破棺而出躲株,到底是詐尸還是另有隱情片部,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布霜定,位于F島的核電站档悠,受9級特大地震影響,放射性物質發(fā)生泄漏望浩。R本人自食惡果不足惜辖所,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磨德。 院中可真熱鬧缘回,春花似錦、人聲如沸剖张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搔弄。三九已至幅虑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顾犹,已是汗流浹背倒庵。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炫刷,地道東北人擎宝。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像浑玛,于是被迫代替她去往敵國和親绍申。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容