1. 程式人生 > >面向物件程式設計進階

面向物件程式設計進階

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...