面向物件程式設計進階
python內建函式
isinstance(obj,class)
判斷一個物件是否是已知的型別,類似type()
isinstance語法:isinstance(object,classinfo)
- object 是例項/物件
- classinfo 可以是直接或間接類名,基本型別或者由他們組成的元組
返回值
如果物件的型別與classinfo相同,返回bool值True,否則返回False
isinstance 與type的區別:
- type()不會認為子類是一種父類型別,不考慮繼承關係
- isinstance() 會認為子類是一種父類型別,考慮繼承關係,
如果要判斷兩個型別是否相同的時候儘量用isinstance()
示例1:
a = [1,2,3] print(isinstance(a,list))
輸出: True
示例2:
class A(object):pass class B(A):pass b=A() print(isinstance(b,A)) # 返回True b 是 A 的物件 print(type(b) is B) # 返回False b不是B類的物件 print(type(b) is A) #type 在這裡是檢測物件是不是類的物件/例項
issubclass( )
判斷兩個類是否有繼承關係,,如果真的有繼承關係,那就返回bool值True/False
class A(object):pass class B(A):pass print(issubclass(B,A)) # True B類是A類的子類 print(issubclass(A,B)) # False
內建方法
什麼是內建方法?
內建方法也叫雙下方法,魔術方法,它們在python中處處皆是,它們是一些可以讓你對類新增"魔法"的特殊方法,經常都是雙下劃線包圍來命名的比如(__init__,__str__)等等,到現在還是沒有很好的辦法來解釋它們.
內建方法的特點
一定有某一個語法或者一種寫法自動觸發這個方法.
常見常用的內建方法
最常見的__init__ 是個初始化方法,類的初始化方法, 然而當我們執行 a =class()的時候,__init__並不是 第一個被呼叫的方法,事實上__new__第一個被呼叫,這個方法才真正的建立了例項/物件,當這個物件生命週期結束的時候,這時候__del__方法會被呼叫.看到這樣的聯絡,讓我們進一步瞭解他們的特性!
__new__ 也叫構造方法,__(cls,[...)__ 它提供了一個例項化物件的時候所需要的記憶體空間 例如--->建立空間
首先說說設計模式中的單例模式, __new__是物件例項化的時候第一個被呼叫的方法,它只取cls也就是類的引數,把其他引數傳給__init__..
單例模式示例1
class Teacher2: flag = None #靜態屬性為空 def __new__(cls, *args, **kwargs): if cls.flag is None: #執行判斷 cls.flag 也就是Teacher2類的靜態屬性為空的情況下 cls.flag = object.__new__(cls) #這句話直走一次 #Teacher2繼承的父類 object.__new__(cls)開闢/構建的空間地址賦予Teacher2類的靜態屬性 print(cls.flag) return cls.flag #類的靜態屬性得到的空間地址賦值Sheldon2 Sheldon2 = Teacher2() ssa = Teacher2() #當ssa執行例項化的時候,flag 已經不等於None,而等於一個空間地址, 不走if判斷,直接把原先的空間地址賦值給ssa
單例模式示例2
class Teacher: flag = None def __new__(cls,*args,**kwargs): # if cls.flag is None: cls.flag = object.__new__(cls) return cls.flag def __init__(self,name): self.name = name Sheldon = Teacher('Sheldon') Penny = Teacher('Penny') print('Sheldon.name') #輸出 Sheldon print('Penny.name') #輸出 Penny print('Sheldon.name') ##輸出 Penny
__init__ (self[...) 類初始化方法
它獲取任何傳給構造器的引數,(例如Sheldon = Teacher('Sheldon') __init__ 就會接收到引數Sheldon. __init__在python類的定義中用的最多
__del__ (self) 析構方法
__del__ 是物件的銷燬器,它並不是實現了語句中 del Sheldon 因此它並不等於 Sheldon.__del__(), 而是定義了物件的垃圾回收時的行為,當物件需要銷燬時做的一些處理的時候,這個方法會用到,
class Teacher: def __init__(self,name): self.name = name def __del__(self): print('執行刪除動作') Sheldon = Teacher('Sheldon') print('11111') # 輸出順序 11111 ---> 執行刪除動作 ---> 刪除Sheldon del Sheldon # 執行del 物件的時候觸發了__del__ ,在真正刪除Sheldon物件前,執行方法__del__ # 如果我們不刪除 Sheldon ,那麼程式的執行過程中或最後,垃圾回收機制會替你執行del Sheldon # del Sheldon ---> 執行__del--->刪除Sheldon
...