Python 面向物件【初級篇】
阿新 • • 發佈:2019-02-08
Python 是一門面向物件的語言。本文是面向物件程式設計的初級篇,僅介紹封裝,不涉及繼承和多型。鑑於C++也是一門面向物件的語言,裡面有很多相通之處。
類的成員
類的成員可以分為三大類:變數、方法 和 屬性
變數
- 普通變數屬於
物件
- 靜態變數屬於
類
,即不管例項化了多少個物件,靜態變數只有一份
class student:
# 靜態變數
type = "human"
def __init__(self, id, name):
# 普通變數
self.id = id
self.name = name
# 訪問靜態變數
print(student.type)
# 訪問普通變數
s = student(3, "mick")
print(s.name)
print(s.type) # 靜態變數也可以由物件訪問
方法
- 普通方法:由
物件
呼叫,至少一個self
引數,執行普通方法時,自動將呼叫該方法的物件賦值給self
- 類方法:由
類
或物件
呼叫,至少一個cls
引數,執行類方法時,自動將呼叫該方法的類
複製給cls
- 靜態方法:由
類
或物件
呼叫,無預設引數
class student:
type = "human"
def __init__(self, id, name) :
self.id = id
self.name = name
# 普通方法
def show(self):
print("id: {0}\t name: {1}".format(self.id, self.name))
# 類方法
@classmethod
def another_init(cls, id, name):
return cls(id, name)
# 靜態方法
@staticmethod
def Hello():
print("Hello" )
s = student.another_init(3, "mick")
s.show()
s.Hello()
student.Hello()
相同點:三種方法都歸屬於類,記憶體上只有一份。
不同點:三種方法的區別在於傳入的引數不同,普通方法
一定要物件
來呼叫,因為普通方法的第一個引數是物件本身,類方法
和 靜態方法
既可以用物件
呼叫,也可以用類
直接呼叫,它倆的區別在於類方法
還會傳入將類作為引數傳入,而靜態方法
則沒有必須要傳入的引數。
屬性
Python 中的屬性其實是普通方法的變種,呼叫時:無需括號,像是訪問變數一樣
屬性的定義方式
- 裝飾器:在方法上應用裝飾器
- 靜態變數方式:在類中定義值為property物件的靜態變數
Python3 取消了經典類,只有新式類。
一、裝飾器方式:@property、@方法名.setter、@方法名.deleter
class student:
def __init__(self, id, name):
# 普通變數
self.id = id
self.name = name
@property # 由property裝飾,這個類方法變為讀屬性
def myname(self):
return self.name
@myname.setter # 由setter裝飾,這個類方法變為寫屬性
def myname(self, name):
self.name = name
@myname.deleter # 由deleter裝飾,這個類方法變為寫屬性
def myname(self):
del self.name
s = student(3, "mick")
print(s.myname)
s.myname = "chen"
print(s.myname)
del s.myname
二、靜態變數方式:構造 property 物件
class student:
def __init__(self, id, name):
# 普通變數
self.id = id
self.name = name
def get_name(self):
return self.name
def set_name(self, name):
self.name = name
def del_name(self):
del self.name
# 引數依次對應獲取,設定,刪除
myname = property(get_name, set_name, del_name)
s = student(3, "mick")
print(s.myname)
s.myname = "chen"
print(s.myname)
del s.myname
類成員許可權
分為兩種:
- 公有成員:在任何地方都可以訪問
- 私有成員:在類的內部才可以訪問,命名時前兩個字元是下劃線
私有成員通過 物件. _ 類名 __ 變數名 可以強制訪問
class student:
# 靜態變數
type = "human"
__sex = "male"
def __init__(self, id, name):
# 普通變數
self.__id = id
self.name = name
def show(self):
print(student.type, student.__sex, self.__id, self.name)
class postgraduate(student):
def show(self):
print(student.type, self.name)
s = student(3, "mick")
# 父類
s.name
s.type
s._student__id
s._student__sex
s.show()
# 子類
p = postgraduate(1, "hwdtc")
p.name
p.type
p._student__id
p._student__sex
p.show()