1. 程式人生 > >Python中常用的內建方法:__del__和__dict__使用

Python中常用的內建方法:__del__和__dict__使用

     因為python中所有類預設繼承object類。而object類提供了了很多原始的內建屬性和方法,所以使用者自定義的類在Python中也會繼承這些內建屬性。可以使用dir()函式可以檢視,雖然python提供了很多內建屬性但實際開發中常用的不多。而很多系統提供的內建屬性實際開發中使用者都需要重寫後才會使用。對於python來說,屬性或者函式都可以被理解成一個屬性

1.常用內建屬性:__del__

1.__del__的功能與用法:
   1.當刪除一個物件時,python直譯器會預設這個方法為__del__()方法,使用者也可以重寫這個方法。
   2.注意:當使用del刪除變數指向的物件時,如果物件的引用計數不會1,比如3,那麼此時只會讓這個引用計數減1,即變為2。
    當再次呼叫del時,變為1,如果再呼叫1次del,此時會真的把物件進行刪除,具體關於python的GC回收機制。
   3.可以使用del刪除繫結的屬性,也可以直接刪除物件。
 
class Student(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        print("我是str")
        return "Student(%s,%d)"%(self.name,self.age)

    def __del__(self): #重寫父類object的__del__方法,不重寫也可以直接使用__del__方法。
        print("__del__方法被呼叫")
        print("%s物件馬上被幹掉了..." % self.name)

s1 = Student("JACK",29)
print(s1)
del s1  #注意這裡del在外部呼叫的方式
#print(s1)  NameError: name 's1' is not defined

'''結果如下:
Student(JACK,29)
__del__方法被呼叫
JACK物件馬上被幹掉了...
'''
#使用del刪除繫結的屬性
s1.sex = "male"
print(s1.sex) #male
del s1.sex  #注意這裡del在外部呼叫的方式s
print(s1.sex) #已刪報錯。


總結:del的使用其實體驗了python語言的動態性,可以在執行時繫結屬性和方法,也可以在執行時刪除屬性和方法,甚至刪除例項本身。具體參考部落格:Python語言的動態性:執行時動態繫結,刪除屬性和方法

2.常用內建屬性:__dict__  

1.__dict__的功能和使用:
   1.__dict__是用來儲存物件屬性的一個字典,其鍵為屬性名,值為屬性的值,類如屬性,則字典是空的。
   2.因為類也是物件,所以類和例項都有這個屬性。
   3.因為__dict__儲存的是物件的屬性鍵值對字典,所以有字典的特性,可以直接用K求V
   4.注意:__dict__儲存的類的普通屬性,類屬性不會放到__dict__中

class Student(object):
    country = "china"  #類屬性不會放到__dict__中
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        print("我是str")
        return "Student(%s,%d)"%(self.name,self.age)

s1 = Student("JACK",29)
print(s1.__dict__)
print(s1.__dict__["name"]) #JACK 
print(Student.__dict__)
'''
{'name': 'JACK', 'age': 29}
JACK
{'__module__': '__main__', '__init__': <function Student.__init__ at 0x0000026A3F637AE8>, 
'__str__': <function Student.__str__ at 0x0000026A3F637B70>, '__dict__': <attribute '__dict__' of 'Student' objects>, 
'__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

'''