1. 程式人生 > >Python 面向物件【初級篇】

Python 面向物件【初級篇】


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()