Python | 魔法屬性 | 魔法方法

前言

在python中,以前后各有兩個下劃線的這種方式命名的標識符,稱為魔法屬性,或魔法方法顽冶,這些魔法屬性或魔法方法,是python中內(nèi)置的,預先定義好一些功能的屬性或方法售碳。接下來就分別介紹它們绞呈。

init 方法的基本使用與代碼解析

  • init 方法的作用是為對象進行初始化 initialization佃声,該方法會在創(chuàng)建對象時,自動調(diào)用
  • 一般會將對象所具有的屬性放到這個方法中,進行初始化,不在使用動態(tài)綁定為對象添加屬性
  • 使用方法: self.屬性名 = 值 的方式添加屬性
'''
 通過 __init__  方法來為對象進行初始化
'''
# 定義一個學生類
class Student(object):
    # 實現(xiàn) __init__ 方法
    def __init__(self):
        print('Init Run ...')
        # 添加屬性
        self.name = 'tom'
        self.age = 12

tom = Student()
print(tom.name)
print(tom.age)

jack = Student()
# 對屬性的修改
jack.name = 'Jack'
print(jack.name)
print(jack.age)

結(jié)果如下:

Init Run ...
tom
12
Init Run ...
Jack
12
問題圾亏?

在類的方法里定義屬性的固定值封拧,則每隔對象實例變量的屬性值都是相同的泽西,有什么辦法可以讓實例的每個對象都有不同的屬性值?

帶參數(shù)的init方法使用與代碼解析

  • 通過一個類陕见,可以創(chuàng)建多個對象味抖,就好比 通過一個模具創(chuàng)建多個實體一樣
  • init(selt)中,默認只有一個參數(shù)忍坷,如果在創(chuàng)建對象時傳遞了2個實參承匣,那么init(selt)中出現(xiàn)了self作為第一個形參外锤悄,還需要2個形參零聚,例如:init(selt,x,y) 代碼解析如下:
'''
通過 init 方法些侍,傳入相應(yīng)的參數(shù),利用這些參數(shù)為對象的屬性進行初始化
'''

class Student(object):
    # 實現(xiàn) 帶參數(shù)的init方法
    def __init__(self, new_name,new_age):

        # 添加 屬性
        self.name = new_name
        self.age = new_age
        print(f'{self.name} Init Run')

# 實例一個對象
tom = Student('tom',12)
print(tom.name)
print(tom.age)


jack = Student('Jack',22)
print(jack.name)
print(jack.age)

結(jié)果如下:

tom Init Run
tom
12
Jack Init Run
Jack
22

str 使用方法及代碼解析

  • 當使用print輸出對象時蚂会,默認打印對象的內(nèi)存地址胁住。如果類定義了str(self)方法,那么就會打印從這個方法中return的數(shù)據(jù)
  • str方法通常返回一個字符串彪见,作為這個對象的描述信息 代碼解析如下:
class Cat(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 實現(xiàn)__str__ 方法
    # 該 方法必須 返回一個字符串類型的數(shù)據(jù)
    def __str__(self):
        # return f'[姓名:{self.name} 年齡:{self.age}]'
        # return f'{"name":{self.name}, "age":{self.age}}' # 因為{}的原因余指,所以不行
        # return '{name:%s, age: %d}' %(self.name,self.age)
        return '{' + f'name:{self.name}, age:{self.age}' + '}'


tom = Cat('Tom', 1)
print(tom)

jack = Cat('Jack',2)
print(jack)


#調(diào)用str方法,把對象tom傳入碉碉,得到的結(jié)果一樣
stu_string = str(tom)

結(jié)果如下:

{name:Tom, age:1}
{name:Jack, age:2}
#調(diào)用方法后的結(jié)果垢粮,和上面結(jié)果一樣
{name:Tom, age:1}
{name:Jack, age:2}

del方法使用及代碼解析

  • 當刪除對象后缸濒,python解釋器也會默認調(diào)用一個方法,就是del()
  • 當有變量保存了一個對象的引用時斩跌,此對象的引用計數(shù)就會加1
  • 當使用del()刪除變量指向的對象時捞慌,則會減少對象的引用計數(shù)啸澡。如果對象的引用計數(shù)不為1,那么會讓這個對象的引用計數(shù)減1洛姑,當對象的引用計數(shù)為0時皮服,則對象才會被真正的刪除(內(nèi)存被回收)。
'''
__del__方法
用來在銷毀對象時自動 調(diào)用 該 方法
'''

class Cat(object):
    def __init__(self):
        self.childs = ['tom1','tom2','tom2']

    def __del__(self):
        # 在銷毀當前對象之前硫眯,將自己管理的屬性對象先銷毀择同,回收資源
        # del self.childs
        print('Del Run ...')


tom = Cat()
# del tom

tom.childs


print('over')

結(jié)果如下:

over
Del Run ...

改變del方法代碼后:

    def __del__(self):
        # 在銷毀當前對象之前敲才,將自己管理的屬性對象先銷毀择葡,回收資源
        del self.childs
        print('Del Run ...')


tom = Cat()
del tom

tom.childs

print('over')

刪除之后結(jié)果如下:

Traceback (most recent call last):
NameError: name 'tom' is not defined
Del Run ...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刁岸,一起剝皮案震驚了整個濱河市虹曙,隨后出現(xiàn)的幾起案子番舆,更是在濱河造成了極大的恐慌,老刑警劉巖疏哗,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件返奉,死亡現(xiàn)場離奇詭異吗氏,居然都是意外死亡,警方通過查閱死者的電腦和手機污尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門被碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仿村,“玉大人,你說我怎么就攤上這事包颁⊙拐妫” “怎么了滴肿?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵泼差,是天一觀的道長。 經(jīng)常有香客問我堆缘,道長,這世上最難降的妖魔是什么录平? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任斗这,我火速辦了婚禮啤斗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘免钻。我一直安慰自己崔拥,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布姆怪。 她就那樣靜靜地躺著稽揭,像睡著了一般肥卡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揪胃,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天喊递,我揣著相機與錄音阳似,去河邊找鬼。 笑死,一個胖子當著我的面吹牛当宴,可吹牛的內(nèi)容都是我干的泽疆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼梯浪,長吁一口氣:“原來是場噩夢啊……” “哼驱证!你這毒婦竟也來了恋腕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤伙单,失蹤者是張志新(化名)和其女友劉穎吻育,沒想到半個月后淤井,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡游两,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年贱案,在試婚紗的時候發(fā)現(xiàn)自己被綠了止吐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘩燥,死狀恐怖厉膀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情站蝠,我是刑警寧澤菱魔,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布澜倦,位于F島的核電站杰妓,受9級特大地震影響藻治,放射性物質(zhì)發(fā)生泄漏桩卵。R本人自食惡果不足惜倍宾,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一高职、第九天 我趴在偏房一處隱蔽的房頂上張望钩乍。 院中可真熱鬧寥粹,春花似錦埃元、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衫生。三九已至土浸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黄伊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工墓阀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人经伙。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓帕膜,卻偏偏與公主長得像溢十,于是被迫代替她去往敵國和親垮刹。 傳聞我的和親對象是個殘疾皇子荒典,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容