python学习高级篇(part2)--类方法,静态方法,访问控制
學習筆記,僅供參考,有錯必糾
學習資源:圖解python
文章目錄
- 類方法
- 舉個例子
- 靜態方法
- 舉個例子
- 訪問控制
- 舉個例子
- 舉個例子
- 舉個例子
類方法
類方法指的是類對象中使用裝飾器@classmethod進行裝飾的方法。在類對象中定義類方法時,必須使用裝飾器@classmethod進行裝飾,此外,第一個形參表示類對象其對應的實參由系統自動傳入。第一個形參的名稱通常是cls,也可以是其它名稱。
類方法可以被類對象所調用,語法格式為:類對象.方法名([實參])或cls.方法名([實參])。
類方法也可以被實例對象所調用,語法格式為:實例對象.方法名([實參])或self.方法名([實參])。
類對象的所有實例對象都有一個指向類對象的指針,所以,類對象的所有實例對象都可以調用類對象中定義的類方法。
調用類方法時,系統自動將類對象作為實參傳遞給第一個形參。第一個實參會傳遞給第二個形參第二個實參會傳遞給第三個形參,依次類推。
舉個例子
代碼:
class MyClass(object):@classmethoddef cm1(cls, p1, p2):print(p1, p2)@classmethoddef cm2(cls):MyClass.cm1(1, 2)cls.cm1(1, 2)def im(self):self.cm1(1, 2)MyClass.cm1(1, 2) mc = MyClass()mc.cm1(1, 2) mc.cm2()mc.im()輸出:
1 2 1 2 1 2 1 2 1 2靜態方法
類對象的靜態方法只是一個普通函數。把某個普通函數歸屬于類對象,可能只是為了易于代碼管理。
在類對象中定義靜態方法時,必須使用裝飾器@staticmethod進行裝飾。靜態方法只是一個普通函數因此,第一個形參沒有特殊含義和要求。
靜態方法可以被類對象所調用,語法格式為:類對象.方法名([實參])或cls.方法名([實參])。
靜態方法也可以被實例對象所調用,語法格式為:實例對象.方法名([實參])或self.方法名([實參])。
調用靜態方法時的參數傳遞與調用普通函數是一樣的。
舉個例子
代碼:
class MyClass(object):@staticmethoddef sm(p1, p2):print(p1, p2)@classmethoddef cm(cls):MyClass.sm(1, 2)cls.sm(1, 2)def im(self):self.sm(1, 2)MyClass.sm(1, 2) mc = MyClass()mc.sm(1, 2) MyClass.cm() mc.im()輸出:
1 2 1 2 1 2 1 2 1 2訪問控制
訪問控制指的是:控制類對象的屬性和方法在類對象的外部是否可以直接訪問。
如果在類對象的某個屬性或方法前添加兩個下劃線_,那么在類對象的外部就不能直接訪問該屬性或方法了。
舉個例子
代碼:
class MyClass(object):def __init__(self):self.__pia = 18def __pim(self):print("__pim()被調用了")mc = MyClass() print(mc.__pia)輸出:
Traceback (most recent call last):File "fangwenkongzhi.py", line 15, in <module>print(mc.__pia) AttributeError: 'MyClass' object has no attribute '__pia'之所以不能在類對象的外部直接訪問以雙下劃線開頭的屬性或方法,是因為:Python解釋器對外把屬性或方法__xxx改成了另外一個名字:_類名__xxx。所以,在類對象的外部仍然可以通過_類名__xxx訪問屬性或方法__xxx。但是,強烈建議不要這樣訪問,因為不同版本的Python解釋器可能會把屬性或方法__xxx改成不同的名字。
同時,仍然可以在類對象的外部動態綁定名為__XXX的屬性或方法,但是,這與類對象內部名為__XXX的屬性或方法
是不同的。
舉個例子
代碼:
class MyClass(object):def __init__(self):self.__pia = 18def __pim(self):print("__pim()被調用了")def do_sth(self):print(self.__pia)self.__pim()mc = MyClass()mc.do_sth()print(mc._MyClass__pia) mc._MyClass__pim() print(dir(mc))mc.__pia = "Hi" print(mc.__pia) print(dir(mc))輸出:
18 __pim()被調用了 18 __pim()被調用了 ['_MyClass__pia', '_MyClass__pim', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'do_sth'] Hi ['_MyClass__pia', '_MyClass__pim', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__pia', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'do_sth']除了在類對象的屬性或方法前添加兩個下劃線_,還可以在類對象的屬性或方法前添加單下劃線_,
這表示:雖然可以在類對象的外部訪問該屬性或方法,但是最好不要訪問。
舉個例子
代碼:
class SomeClass(object):def __init__(self):self._pia = 18def _pim(self):print("_pim()被調用了")sc = SomeClass()print(sc._pia) sc._pim()輸出:
18 _pim()被調用了總結
以上是生活随笔為你收集整理的python学习高级篇(part2)--类方法,静态方法,访问控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习高级篇(part1)--
- 下一篇: python学习高级篇(part3)--