面向對象之反射 與__str__等內置函數

一  反射
python

  1.面向對象中的反射:經過字符串的形式操做對象的相關屬性,python中一切事物都是屬性(均可以使用反射)mysql

  四個能夠實現自省<反射>的函數:hasattr /  getattr  / setattr  /delattr.程序員

class Teacher:
    school='oldboy'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def teach(self):
        print('%s teach'%self.name)

print(Teacher.school)   ##查看類的數據屬性
print(Teacher.__dict__)     ##查看類的名稱空間
print(Teacher.__dict__['school'])      #根據名稱空間的KEY找到對應的值

print(hasattr(Teacher,'school'))      #判斷是是否有school屬性
print(getattr(Teacher,'school'))      #獲取類的屬性值
print(getattr(Teacher,'schoolle',None))  #獲取school的返回值,若是沒有可設置返回值

Teacher.x=123456
setattr(Teacher,'x',123)              #修改屬性
print(Teacher.x)

delattr(Teacher,'school')             #刪除屬性
print(Teacher.school)
setattr(Teacher,'school','偶的博愛')
print(Teacher.school)

##對象一樣能夠利用反射,經過字符串的形式操做相關屬性
t=Teacher('egon',18)
print(hasattr(t,'name'))
print(getattr(t,'name'))
print(setattr(t,'sex','male'))
print(getattr(t,'sex'))
View Code

  在建立類的時候,會產生名稱空間,存放着各個屬性的名稱與值得綁定關係,並且以字典的形式進行存放,因此語法上用比較貼切的__dict__即可查看.若是咱們想取值的話,能夠用Teacher.school來得到屬性,但同時咱們能夠利用__dict__中的key來取值,即Teacher.__dict__['school'].注意裏面是字符串的形式.而因爲咱們用戶input輸入的時候是字符串形式,爲了便於獲取相關屬性就產生了反射的概念,具體請研究上面的代碼欄。sql

 

二  __str__的用法ide

  改變對象的字符串顯示函數

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.courses=[]

    def teach(self):
        print('%s teach'%self.name)

    def __str__(self):          ##改變對象的字符串形式
        return '<name: %s age:%s>'%(self.name,self.age)
        ##返回值必須是字符串,不然會拋出異常


egon=Teacher('egon',18)
print(egon)  #print(egon.__str__())
View Code

 

三   __del__的用法spa

  當對象在內存中被釋放時,自動觸發執行。code

  注:此方法通常無須定義,由於Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,由於此工做都是交給Python解釋器來執行,因此,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。對象

import time
class Foo:
    def __init__(self,x):
        self.x=x
        print('connect mysql')

    def __del__(self):
        '''作一些與這個對象有關的清理操做'''
        print('good')

f=Foo(10)
print(f.x)

=========結果======
connect mysql
10 
good   ----->由此能夠當對象在內存中被釋放時,自動觸發執行
View Code
相關文章
相關標籤/搜索