@
作業系統: Window 10
工具:Pycharm
Python: 3.7
功能:
使用該__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
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__() 方法
輸出結果很有意思,物件無需加 . (點)就可以呼叫類的方法,這意味著物件本身就是一個函數物件,不過這應該是類似一種軟連線的操作,將物件的點呼叫操作連線到物件括號,這個別名。
功能:
在 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
關鍵字代表了類的所有的範例,每一個類範例化都會有的一個屬性
功能:
如果定義了該函數,當
return
資訊 可用於定義當前類__str__()
方法定義的描述資訊
- 引數:無
- 返回值:一般返回對於該類的描述資訊
程式碼演示:
class Test(object):
def __str__(self):
return '這是關於這個類的描述'
test = Test()
print(test)
執行結果:
功能:
當呼叫的屬性或者方法不存在時,會返回該方法(
__getattr__()
)定義的資訊
class Test(object):
def __getattr__(self, key):
print('這個key:{}不存在'.format(key))
test = Test()
test.a
執行結果:
功能:
攔截當前類中不存在的屬性與值
程式碼演示:
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類特殊成員(屬性和方法)