作者介紹:【孤寒者】—CSDN全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域博主、CSDN原力計劃作者
- 本文已收錄於Python全棧系列專欄:《Python全棧基礎教程》
- 熱門專欄推薦:《Django框架從入門到實戰》、《爬蟲從入門到精通系列教程》、《爬蟲高級》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
- 本專欄面向廣大程序猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
- 訂閱專欄後可私聊進一千多人Python全棧交流群(手把手教學,問題解答);進群可領取Python全棧教程視頻 + 多得數不過來的計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
- 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class People(object):
country = 'china'
#類方法,用classmethod來進行修飾
@classmethod
def getCountry(cls):
return cls.country
p = People()
print(p.getCountry()) #可以用過實例對象引用
print(People.getCountry()) #可以通過類對象引用
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class People:
country = 'china'
#類方法,用classmethod來進行修飾
@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country = country
p = People()
print(p.getCountry()) #可以用過實例對象引用
print(People.getCountry()) #可以通過類對象引用
p.setCountry('japan')
print(p.getCountry())
print(People.getCountry())
需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義參數。
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class People:
country = 'china'
# 靜態方法
@staticmethod
def getCountry():
return People.country
print(People.getCountry())
從類方法和實例方法以及靜態方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那麼通過cls引用的必定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那麼通過self引用的可能是類屬性、也有可能是實例屬性(這個需要具體分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先級更高。靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引用
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class Student(object):
pass
s = Student()
s.name = 'Michael' # 動態給實例綁定一個屬性
def set_age(self, age): # 定義一個函數作為實例方法
self.age = age
from types import MethodType
s.set_age = MethodType(set_age, s) # 給實例綁定一個方法
s.set_age(25) # 調用實例方法
print(s.age) # 測試結果
但是,給一個實例綁定的方法,對另一個實例是不起作用的:
s2 = Student() # 創建新的實例
s2.set_age(25)
Traceback (most recent call last):
File "D:/******/test.py", line 17, in <module>
s2.set_age(25)
AttributeError: 'Student' object has no attribute 'set_age'
為了給所有實例都綁定方法,可以給class綁定方法:
def set_score(self, score):
self.score = score
Student.set_score = MethodType(set_score, Student)
給class綁定方法後,所有實例均可調用:
s.set_score(100)
print(s.score)
s2 = Student()
s2.set_score(99)
print(s2.score)
通常情況下,上面的set_score方法可以直接定義在class中,但動態綁定允許我們在程序運行的過程中動態給class加上功能,這在靜態語言中很難實現。
__slots__
限制綁定__slots__
變量,來限制該class能添加的屬性:class Student(object):
__slots__ = ('name', 'age')
s = Student() # 創建新的實例
s.name = 'xiaoming' # 綁定屬性'name'
s.age = 25 # 綁定屬性'age'
s.score = 99 # 綁定屬性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
__slots__
中,所以不能綁定score屬性,試圖綁定score將得到AttributeError的錯誤。__slots__
要注意,__slots__
定義的屬性僅對當前類起作用,對繼承的子類是不起作用的:__slots__
,這樣,子類允許定義的屬性就是自身的__slots__
加上父類的__slots__
。語法:
class property([fget[, fset[, fdel[, doc]]]])
參數:
返回新式類屬性。
將 property 函數用作裝飾器可以很方便的創建只讀屬性:
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class Parrot(object):
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""Get the current voltage."""
return self._voltage
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
mro順序的作用:
super().__init__()
相當於使用了mro。前面說要講,但是在基礎階段如果深入講的話,我怕大家一時接受不了,所以就先這樣淺顯有個認識即可!有機會我會細講。