程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python魔術方法(持續添加)

編輯:Python

前言

python有很多魔術方法,用的時候到處查,就想著寫個博客記錄一下吧

文章目錄

  • 前言
  • 魔術方法
    • __init__
    • __del__
          • del
          • 程序結束時
    • __getitem__
    • __setitem__
    • __delitem__
    • __getattr__
    • __setattr__
    • __delattr__

魔術方法

init

這個方法我認為就相當於構造方法,用於初始化類,在實例化的時候調用,傳入的參數一般就是對應的對象的屬性

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('cgy', 19)
print(p.name, p.age) # cgy 19

del

這個方法就是析構方法,在對象被銷毀的時候調用(1. del關鍵字 2. 程序結束後)

del
class Person:
def __del__(self):
print('對象被銷毀')
p = Person()
del p # 對象被銷毀
print('flag')

會發現在打印flag之前,會打印"對象被銷毀",就是說,在del p的時候,對象確實被銷毀了

程序結束時

這裡用到了一個atexit模塊,他可以在程序結束時做一些事情

import atexit
atexit.register(lambda x: print(x), '程序結束了')
class Person
def __del__(self):
print('對象被銷毀')
p = Person()

會發現打印順序是1. 程序結束了,2. 對象被銷毀,就是說程序結束之後在清空程序用到的內存的時候,才打印出了“對象被銷毀”這句話

getitem

在像字典一樣獲取元素時調用

setitem

在像字典一樣設置屬性時調用

delitem

在像字典一樣刪除元素時調用
這三個魔術方法可以讓對象跟字典一樣使用,而字典類似於js裡面的對象,所以我覺得就是使得python的對象能夠跟js裡面的對象有共同的表現形式的方法。

class Animal(object):
def __getitem__(self, item):
print('__getitem__ ', item)
return self.__dict__.get(item)
def __setitem__(self, key, value):
print('__setitem__', key, ': ', value)
self.__dict__[key] = value
def __delitem__(self, key):
print('__delitem__')
del self.__dict__[key]
a = Animal()
a['name'] = 'cgy'
print(a['name'])
del a['name']

在上面的代碼中,除了實例化的a = Animal(),其他三行代碼分別調用了__setitem__、__ getitem__、__delitem __。而且只有在像字典一樣使用這個對象的時候,才會調用這幾個方法,如果是a.name = 'cgy'print(a.name)del a.name,這樣子是不會調用這幾個方法的。但是如print(a.name)是可以獲取到cgy這個字符串的。

然後,我個人認為就是,__delitem__這個方法,是可以保證程序正常運行的一個方法,使得我們在錯誤刪除屬性的時候,程序還是可以正常運行,可以在裡面使用try…except…語句,然後抓住異常,進行處理,即:如果沒有這樣的屬性名,打印提示信息

 def __delitem__(self, key):
try:
del self.__dict__[key]
except KeyError as e:
print('there is no key called', e)

getattr

獲取屬性的時候,如果對象沒有這個屬性,調用這個方法

setattr

每次設置屬性的時候,調用這個方法包括__init__

delattr

刪除屬性的時候,調用這個方法

class Animal:
def __init__(self, name):
self.name = name
def __getattr__(self, item):
# 在獲取__沒有定義__的屬性的時候,調用這個方法
print(f'you want attribute "{
item}", but "{
item}" is not defined')
def __setattr__(self, key, value):
# 設置屬性的時候,調用這個方法
print('__setattr__ ', key, ': ', value)
self.__dict__[key] = value
def __delattr__(self, item):
print('__delattr__')
try:
del self.__dict__[item]
except KeyError as e:
print('there is no key called', e)
a = Animal('cgy')
a.age = 19
print(a.age)
del a.name

上面這段程序,在實例化的那一行,執行了__init__構造方法,會調用一次__setattr__;a.age = 19會再一次調用__setattr__;在print(a.age)因為獲取了a.age,所以會調用一次__getattr__;最後的del a.name會調用__delattr__

我覺得需要區分的是,如果這個類中也有__setitem__等魔術方法,我們像字典一樣操作對象的時候,這些__setattr__等方法是不會被調用的。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved