1

2023-03-24 18:00:49

@


測試環境:

作業系統: Window 10
工具:Pycharm
Python: 3.7

一、系統函數__init__() 初始化類函數

功能:

使用該__init__()類系統方法可以在建立類的範例化物件時,可以初始化物件 —— 傳遞引數(該類的全域性變數),引數可以是函數物件,也可以是各種資料型別的變數
eg:

# test.py
class System_Function:
    def __init__(self, function_or_varible):
        self.function_or_varible = function_or_varible
        print("init(初始化) class System_Function: {0}\n".format(self.function_or_varible))

# 初始化類物件
init_args = 'init_test'
System_Function(init_args)  

程式輸出顯示:

init(初始化) class System_Function: init_test

二、系統函數__call__() 呼叫物件函數

call n. 打電話,通話;喊叫,呼叫;需求,需要;號召,呼籲;執行子程式的命令;

功能:

本質是將一個類變成一個函數

Python 類中一個非常特殊的實體方法,即__call__()。該方法的功能類似於在類中過載 () 運運算元,使得類範例物件可以像呼叫普通函數那樣,以「物件名()」的形式使用。

對於可呼叫物件,實際上「名稱()」可以理解為是「名稱.__call__()」的簡寫。仍以上面程式中定義的 call_obj 範例物件為例,其最後一行程式碼還可以改寫為如下形式:

obj.__call__("obj.__call__","__call__()")

具體程式碼演示:

# test.py
class System_Function:

    def __init__(self, function_or_varible):
        self.function_or_varible = function_or_varible
        print("init(初始化) class System_Function: {0}\n".format(self.function_or_varible))


	## 定義__call__方法
    def __call__(self,func,name):
        print("{0}: 呼叫 {1} 方法 \n".format(func,name))
        
# 初始化類物件
init_args = 'init_test'
obj = System_Function(init_args)  # 類範例化物件 object

## 像呼叫函數方法那樣呼叫 類物件系統函數 __call__()
obj("obj()", "__call__()") 

obj.__call__("obj.__call__","__call__()")

程式輸出顯示:

init(初始化) class System_Function: init_test

obj(): 呼叫 __call__() 方法

obj.__call__: 呼叫 __call__() 方法

輸出結果很有意思,物件無需加 . (點)就可以呼叫類的方法,這意味著物件本身就是一個函數物件,不過這應該是類似一種軟連線的操作,將物件的點呼叫操作連線到物件括號,這個別名

三、系統函數__dict__類屬性查詢函數

功能:

在 Python 類的內部,無論是類屬性還是範例屬性,都是以字典(dict)的形式進行儲存的,其中屬性名作為鍵,而值作為該鍵對應的值

程式碼參考案例:

class CLanguage:
    a = 1
    b = 2
    def __init__ (self):
        self.name = "C語言中文網"
        self.add = "http://c.biancheng.net"
#通過類名呼叫__dict__
print(CLanguage.__dict__)
#通過類範例物件呼叫 __dict__
clangs = CLanguage()
print(clangs.__dict__)

程式輸出顯示:

{'__module__': '__main__', 'a': 1, 'b': 2, '__init__': <function CLanguage.__init__ at 0x0000022C69833E18>, '__dict__': <attribute '__dict__' of 'CLanguage' objects>, '__weakref__': <attribute '__weakref__' of 'CLanguage' objects>, '__doc__': None}
{'name': 'C語言中文網', 'add': 'http://c.biancheng.net'}

個人程式碼案例:

測試1

# test.py
class System_Function:

    def __init__(self, function_or_varible):
        self.function_or_varible = function_or_varible
        print("init(初始化) class System_Function: {0}\n".format(self.function_or_varible))


	## 定義__call__方法
    def __call__(self,func,name):
        print("{0}: 呼叫 {1} 方法 \n".format(func,name))
        
# 初始化類物件
init_args = 'init_test'
obj = System_Function(init_args)  # 類範例化物件 object

## 像呼叫函數方法那樣呼叫 類物件系統函數 __call__()
obj("obj()", "__call__()") 

obj.__call__("obj.__call__","__call__()")

#通過類名呼叫__dict__
print("System_Function 類名呼叫系統函數__dict__,無需引數:\n",System_Function.__dict__)
print("\n")

#通過類範例物件呼叫 __dict__
print("類範例物件 obj 呼叫__dict__:\n",obj.__dict__)

程式輸出顯示:

init(初始化) class System_Function: init_test

obj(): 呼叫 __call__() 方法

obj.__call__: 呼叫 __call__() 方法

System_Function 類名呼叫系統函數__dict__,無需引數:
 {'__module__': '__main__', '__init__': <function System_Function.__init__ at 0x000001EA556B1378>, '__call__': <function System_Function.__call__ at 0x000001EA556B17B8>, '__dict__': <attribute '__dict__' of 'System_Function' objects>, '__weakref__': <attribute '__weakref__' of 'System_Function' objects>, '__doc__': None}


類範例物件 obj 呼叫__dict__:
 {'function_or_varible': 'init_test'}

測試2

# test.py
class System_Function:

    def __init__(self,function_or_varible):
        self.function_or_varible = function_or_varible
        print("init(初始化) class System_Function: {0}\n".format(self.function_or_varible))
    ## 定義__call__方法
    def __call__(self,func,name):
        self.func = func
        self.name = name
        print("{0}: 呼叫 {1} 方法 \n".format(self.func,self.name))
        
# 初始化類物件
init_args = 'init_test'
obj = System_Function(init_args)  # 類範例化物件 object

## 像呼叫函數方法那樣呼叫 類物件系統函數 __call__()
obj("obj()", "__call__()") 

obj.__call__("obj.__call__","__call__()")

#通過類名呼叫__dict__
print("System_Function 類名呼叫系統函數__dict__,無需引數:\n",System_Function.__dict__)
print("\n")
#通過類範例物件呼叫 __dict__
print("類範例物件 obj 呼叫__dict__:\n",obj.__dict__)

程式輸出顯示:

init(初始化) class System_Function: init_test

obj(): 呼叫 __call__() 方法

obj.__call__: 呼叫 __call__() 方法

System_Function 類名呼叫系統函數__dict__,無需引數:
 {'__module__': '__main__', '__init__': <function System_Function.__init__ at 0x0000019AF6801378>, '__call__': <function System_Function.__call__ at 0x0000019AF68017B8>, '__dict__': <attribute '__dict__' of 'System_Function' objects>, '__weakref__': <attribute '__weakref__' of 'System_Function' objects>, '__doc__': None}


類範例物件 obj 呼叫__dict__:
 {'function_or_varible': 'init_test', 'func': 'obj.__call__', 'name': '__call__()'}

需要注意的一點是,該屬性可以用類名或者類的範例物件來呼叫,用類名直接呼叫__dict__,會輸出該由類中所有類屬性組成的字典(未賦予範例化的所有屬性——函數名);而使用類的範例物件呼叫 __dict__,會輸出由類中所有範例屬性組成的字典(包括所有傳過去的形參引數)。

對比測試1測試2 的輸出結果,可以知道當使用類的範例化物件去呼叫__dict__系統函數時,會自動呼叫類的self範例,self關鍵字代表了類的所有的範例,每一個類範例化都會有的一個屬性

四、系統函數__str__()描述類資訊函數

功能:

如果定義了該函數,當print當前範例化物件的時候,會返回該函數的return資訊 可用於定義當前類__str__()方法定義的描述資訊

  1. 引數:無
  2. 返回值:一般返回對於該類的描述資訊

程式碼演示:

class Test(object):
    def __str__(self):
        return '這是關於這個類的描述'
        
test = Test()
print(test)

執行結果:

五、系統函數__getattr__()呼叫類未定義之資訊反饋函數

功能:

當呼叫的屬性或者方法不存在時,會返回該方法(__getattr__())定義的資訊

class Test(object):
    def __getattr__(self, key):
        print('這個key:{}不存在'.format(key))
test = Test()
test.a

執行結果:

六、系統函數__setattr__()攔截類未定義屬性及值的函數

功能:

攔截當前類中不存在的屬性與值

程式碼演示:

class Test(object):
    def __setattr__(self,key,value):
        if key not in self.__dict__:
            self.__dict__[key] = value
t = Test()
t.name ='dewei'
t.name

執行結果:

參考連結:
Python類的高階函數

七、其他的系統函數

此處貼上連結,就不一一詳解了。
Python類特殊成員(屬性和方法)