Python 類中的普通函數、靜态方法、類方法和執行個體方法的調用規範
文章目錄
- Python 類中的普通函數、靜态方法、類方法和執行個體方法的調用規範
-
- 1. 代碼
- 2. 總結
1. 代碼
直接上代碼:
class Test:
def normal_function():
print('我是普通函數!')
@staticmethod
def static_method():
print('我是靜态方法!')
@classmethod
def class_method(cls):
print(f'我是{cls}的類方法!')
def instance_method(self):
print(f'我是{self}的執行個體方法!')
t = Test()
# 普通函數:隻能通過類名調用,不用手動傳參
# t.normal_function()
"""
Traceback (most recent call last):
File "test.py", line 19, in <module>
t.normal_function()
TypeError: normal_function() takes 0 positional arguments but 1 was given
"""
Test.normal_function()
"""
我是普通函數!
"""
# 靜态方法:可以通過執行個體和類名調用,不用手動傳參
t.static_method()
Test.static_method()
"""
我是靜态方法!
我是靜态方法!
"""
# 類方法:可以通過執行個體和類名調用,自動傳遞類給 cls 形參
# 注意:即使通過執行個體調用類方法,Python 自動傳遞的也是類,而不是執行個體
t.class_method()
Test.class_method()
"""
我是<class '__main__.Test'>的類方法!
我是<class '__main__.Test'>的類方法!
"""
# 執行個體方法:
# 通過執行個體調用,自動傳遞執行個體給 self 形參
# 通過類調用,需要手動傳遞一個執行個體給 self 形參
t.instance_method()
Test.instance_method(t)
"""
我是<__main__.Test object at 0x00000189E6A3AC88>的執行個體方法!
我是<__main__.Test object at 0x00000189E6A3AC88>的執行個體方法!
"""
# 通過類調用,如果不手動傳遞執行個體給 self 形參,會缺少參數的錯誤
# Test.instance_method()
"""
Traceback (most recent call last):
File "test.py", line 59, in <module>
Test.instance_method()
TypeError: instance_method() missing 1 required positional argument: 'self'
"""
2. 總結
總結如下:
- 普通函數:隻能通過類調用。
- 靜态方法:可以通過類和執行個體調用,在此過程中,
不會自動傳參,當然也不用手動傳遞類或者執行個體作為參數。Python
- 類方法:可以通過類和執行個體調用,
會自動傳遞類給Python
形參。cls
- 執行個體方法:可以通過類和執行個體調用。通過執行個體調用時,
會自動傳遞執行個體給Python
形參;通過類調用時,需要手動傳遞一個執行個體給self
形參,否則會報錯。self
完成于
2019.01.18