6.4 類方法和物件方法
方法的本質其實就是函式,在模塊中定義就是函式,在類中定義就是類的方法,方法按照歸屬分類一般有3種:物件方法、類方法、靜態方法,
6.4.1 物件方法
class Person:
cls_attr = '我是類屬性'
def __init__(self):
self.obj_attr = '我是物件屬性'
def eat(self):
print('我在吃飯,別煩我,')
zhangsan = Person()
zhangsan.eat()
我在吃飯,別煩我,
在上面的代碼中:
我們在用def eat(self):定義了一個函式,而這個函式是在類中定義的,則稱為這個類的方法,這個方法內部只有一條命令:print('我在吃飯,別煩我,'),
之前我們已經學會了如何定義一個函式,實際上類中的方法其實就是一個函式,只不過:
1、方法在類的內部定義
2、方法的第一個形參必須要有,通常為self,代表的就是類實體化后的那個物件本身,
3、方法的呼叫為:物件.方法(引數),在呼叫時,開發者不需要再手動傳入一個實參給前面說的self形參,這個行為是在實體化后自動實作的,而函式的呼叫方法為:函式名(引數),
zhangsan.eat():這句代碼是執行了zhangsan物件中的eat方法,結果就是執行了定義時的陳述句:print('我在吃飯,別煩我,')
6.4.2 類方法
如果在定義物件方法前面添加@classmethod的裝飾器后,該方法就從物件方法變成了類方法,如下:
class Person:
def __init__(self):
self.name = '張三'
@classmethod
def eat(cls):
print('我在吃飯,別煩我,')
zhangsan = Person()
zhangsan.eat()
Person.eat()
我在吃飯,別煩我,
我在吃飯,別煩我,
類方法的第一個引數同物件方法一樣,呼叫時不需要傳入,通常形參寫成cls,類方法可以通過類名或者實體化后的物件呼叫,
6.4.3 靜態方法
靜態方法則是在定義方法時添加了@staticmethod裝飾器的方法,
class Person:
def __init__(self):
self.name = '張三'
@staticmethod
def eat():
print('我在吃飯,別煩我,')
zhangsan = Person()
zhangsan.eat()
我在吃飯,別煩我,
定義靜態方法時,不需要再傳入self、cls等特殊的形參,而可以像其它函式一樣使用引數定義,實際上,靜態方法已經完全就是一個普通函式了,
6.4.4 私有方法
如果在類中定義了以__開頭的方法名,表示該方法是一個私有方法,在類的外部是不可以直接訪問的,當然,和私有屬性一樣,還是可以通過_類名方法名進行訪問的,而以_開頭的方法名也是一樣,可以直接在外部訪問,但是不建議使用,
class MyClass2:
def _fun1(self):
print('fun1')
def __fun2(self):
print('fun2')
mc = MyClass2()
mc._fun1()
mc._MyClass2__fun2()
mc.__fun2()
fun1
fun2
Traceback (most recent call last):
File "E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\main.py", line 13, in
mc.__fun2()
AttributeError: 'MyClass2' object has no attribute '__fun2'
6.4.5 物件方法、類方法、靜態方法的區別
引數區別:
物件方法:
第一個形參必須是指向物件本身,通常為self,呼叫時不需要傳入對應實參,
類方法:
第一個形參必須是指向類本身,通常為cls,呼叫時不需要傳入對應實參,
靜態方法:
形參定義同普通函式一樣,
呼叫屬性區別:
物件方法:
可以通過self.的方式(和第一形參對應)呼叫物件屬性,但是不能呼叫類屬性,
類方法:
可以通過cls.的方式(和第一形參對應)呼叫類屬性,但是不能呼叫物件屬性,
靜態方法:
不能呼叫類屬性和物件屬性,
呼叫區別:
物件方法:
物件可以直接呼叫;類也可以呼叫,前提是物件方法中沒有呼叫物件屬性,
類方法:
物件和類都可以呼叫,無論類方法中有沒有呼叫類屬性,
靜態方法:
物件和類都可以呼叫,但是在呼叫時,靜態方法中無法呼叫物件或類屬性,
總結性代碼如下,其中會報錯的代碼就注釋掉了:
class Person:
cls_attr = '我是類屬性'
def __init__(self):
self.obj_attr = '我是物件屬性'
def eat(self):
# print(cls_attr)
print(self.obj_attr)
@classmethod
def sleep(cls):
print(cls.cls_attr)
# print(self.obj_attr)
@staticmethod
def run():
# print(cls_attr)
# print(self.obj_attr)
print('我是靜態方法')
zhangsan = Person()
zhangsan.eat()
zhangsan.sleep()
zhangsan.run()
# Person.eat()
Person.sleep()
Person.run()
從自動化辦公到智能化辦公我是物件屬性
我是類屬性
我是靜態方法
我是類屬性
我是靜態方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545031.html
標籤:其他
上一篇:Pytest初識
下一篇:python教程:模塊的搜索路徑
