1. 程式人生 > >面向物件高階 之 自動觸發的內建函式

面向物件高階 之 自動觸發的內建函式

---恢復內容開始---

一. isinstance(obj, 類)  判斷物件是不是某個類的例項

print(isinstance(1,int))

class Person:
    pass

p = Person()

print(isinstance(p,Person))

# 結果都為True

二. issubclass(子類,父類)   判斷是否為子類,可以是子子類

class Person:
    pass

class Student(Person):
    pass

print(issubclass(Student,Person))

# 結果為True

三. 反射

當獲得了一個物件,但不清楚物件的內部細節,用到反射

1. hasattr : 是否存在某個attribute

2. getattr : 得到 attribute

3. setattr: 設定 attribute

4. delattr: 刪除 attribute

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eating(self):
        print('everybody can eat
') p = Person('egon',18) # 判斷是否有屬性(返回 True, False) print(hasattr(p, 'name')) #設定屬性 setattr(p,'gender','male') print(p.__dict__) #{'name': 'egon', 'age': 18, 'gender': 'male'}

# 設定方法
def run(self):
print('everyone can run')
setattr(p,'run',run)

p.run(p) # 如果是外部新增的函式,呼叫時必須傳入物件作為引數(因為他只是一個函式,不是方法)
# 得到屬性,三個引數,如果沒有要找的屬性,返回第三個值內容
res = getattr(p,'gender','沒有該屬性')
print(res)  # male

res = getattr(p,'wo','沒有這個屬性')
print(res)  # 沒有這個屬性

# 刪除屬性

delattr(p,'name')

print(p.name)  # 屬性已經刪除,報錯

 特殊的內建函式:

  一般情況下,帶槓槓的內建函式都是在某些時機自動觸發的

1. __str__  : 列印時呼叫的函式,必須返回字串

2. __del__ :    當程式執行結束時,物件從記憶體中被刪除時會自動執行

       刪除的兩種方式:1. 手動刪除 del stu 

               2. 當程式執行結束後自動刪除__del__

  __del__ 用途: 開啟檔案佔兩方面記憶體: 應用程式記憶體和作業系統記憶體

         python 自己建立的資料,在執行結束後自動清理,但當使用python開啟一個不屬於python管理的資料,就需要__del__ 函式手動設定關閉。

# 例:__del__  實際應用
class TextFile:
    def __init__(self,filepath,mode = 'rt',encoding = 'utf-8'):
        self.file = open(filepath,mode = mode,encoding=encoding)
        
    def read(self):
        return self.file.read()
    
    def write(self,text):
        self.file.write(text)
    # 通知程式設計師,物件即將被刪除    
    def __del__(self):
        self.file.close()

tf = TextFile('a.txt',mode = 'wt')

tf.write('aaaa')

3. exec   :excute  表示執行

  作用: 解析字串中的python程式碼,並將得到的名稱儲存到指定的名稱空間

  引數1:需要一個字串物件, 字串中為python語句

  引數2:是一個字典,全域性名稱空間

  引數3:也是一個字典,區域性名稱空間

  注意: 如果沒有宣告全域性,預設為區域性變數

  語法: exec(msg,globalsdic,localsdic)

4. __call__ : 呼叫物件時執行,執行的是物件所在類中的__call__方法

class People:
    def __call__(self, *args, **kwargs):
        print('call is running!')

    def eat(self):
        print('everyone need to eat')

p = People()
p()   # call is running!

總結:呼叫物件,物件的類中的__call__方法執行

總結四種內建的自動觸發的函式:

# People = type(...)
class Foo:
    #物件例項化時自動觸發
    def __init__(self):
        pass
    #列印時自動觸發,必須存在返回值,返回值為字串
    def __str__(self):
        pass
    # 程式執行結束,物件被刪除時,自動觸發
    def __del__(self):
        pass
    # 呼叫物件時,自動觸發物件所在類中的__call__函式
    def __call__(self, *args, **kwargs):
        pass
    
obj = Foo()  # 建立物件,__init__函式自動觸發
print(obj)   # 列印自動觸發 __str__
obj(1,2,3) # 自動執行__call__方法 (引數為: self:obj   *args: 1,2,3