Python物件導向語法筆記1_類別物件的初始化與共用成員、模組化、繼承

 
一個簡單的Employee物件示範
__init__用途是定義物件剛建立後,預計初始化的流程
類別內的method和一般python函數定義不同,必須包含參數self,並且務必放在第一個參數位置

在單一個main.py程式定義物件並使用物件

class Employee:
    empCount = 0
    #定義物件剛建立後,預計初始化的流程。
    #self就是物件自己本身
    def __init__(self, name, salary):
        self.name = name
        self.yoursalary = salary
        Employee.empCount += 1
    #和一般python函數定義不同,類別內的method必須包含參數self,並且務必放在第一個參數位置
    def displayTotalEmpCount(self):
        print("Total Employee Count: %d" % self.empCount)
    def displayEmpInfo(self):
        print("Name:",self.name,"Salary:",self.yoursalary)

emp1 = Employee("Mike", 42000)
emp1.displayEmpInfo()
emp1.displayTotalEmpCount()
emp2 = Employee("Michelle", 50000)
emp2.displayEmpInfo()
emp1.displayTotalEmpCount()
emp2.displayTotalEmpCount()

可看到empCount會是被各個獨立的物件實體,所共用的屬性,類似以前C#、Java的static修飾。


練習程式2-獨立物件實體成員屬性額外定義與刪除

class Employee:
    empCount = 0
    #定義物件剛建立後,預計初始化的流程。
    #self就是物件自己本身
    def __init__(self, name, salary):
        self.name = name
        self.yoursalary = salary
        Employee.empCount += 1
    #和一般python函數定義不同,類別內的method必須包含參數self,並且務必放在第一個參數位置
    def displayTotalEmpCount(self):
        print("Total Employee Count: %d" % self.empCount)
    def displayEmpInfo(self):
        print("Name:",self.name,"Salary:",self.yoursalary)

emp1 = Employee("Mike", 42000)
emp2 = Employee("Michelle", 50000)

#可以自行針對獨立物件去定義物件成員,注意是互相獨立的,不會連動到其他物件實體。
emp1.age=23
print(emp1.age)
emp1.age=24
print(emp1.age)


#也可透過del 去刪除成員,而因為成員已經不存在所以不能進行打印。
del emp1.age
print(emp1.age)
#emp1定義的age只有它自己能用,emp2沒法去存取,因為其自身根本不存在此age成員
print(emp2.age)





可以藉由python所提供的針對成員檢查的method做一些防呆
  • getattr : 返回物件某成員(屬性、方法)的內容
  • hasattr : 檢查物件某成員是否存在,存在返回true,反之則傳回false。
  • setattr : 設定物件某成員的內容。若此成員不存在則會建立。
  • delattr : 刪除指定成員
練習程式3-物件成員的增、刪、判斷

class Employee:
    empCount = 0
    #定義物件剛建立後,預計初始化的流程。
    #self就是物件自己本身
    def __init__(self, name, salary):
        self.name = name
        self.yoursalary = salary
        Employee.empCount += 1
    #和一般python函數定義不同,類別內的method必須包含參數self,並且務必放在第一個參數位置
    def displayTotalEmpCount(self):
        print("Total Employee Count: %d" % self.empCount)
    def displayEmpInfo(self):
        print("Name:",self.name,"Salary:",self.yoursalary)

emp1 = Employee("Mike", 42000)
emp2 = Employee("Michelle", 50000)

#可以自行針對獨立物件去定義物件成員,注意是互相獨立的,不會連動到其他物件實體。
emp1.age=23
print(emp1.age)
emp1.age=24
print(emp1.age)

#emp1定義的age只有它自己能用,emp2沒法去存取,因為其自身根本不存在此age成員
if hasattr(emp2, "age"):
    print("age欄位存在")
else:
    print("age欄位不存在")
    setattr(emp2, "age", 23)
    print("已補建立emp2的age欄位:"+str(emp2.age))

if hasattr(emp1, "age"):
    print("age欄位存在,進行刪除")
    delattr(emp1, "age")
    print("emp1不存在:"+str(emp1.age))
else:
    print("age欄位存在,進行刪除")
    setattr(emp1, "age", 22)
    print("建立"+str(emp1.age))




關於class內預設的成員
__dict__ : 類別所屬的命名空間字典
__module_ : 類別隸屬的模組,若無引用其他模組,預設就是__main__
__bases__ : 類別的上層父類別
__name__ : 類別名稱
__doc__ : 類別文字字串

練習程式4-打印class內預設的成員

class Employee:
    '''
    員工類別:用來定義員工物件
    每創建一個員工物件,會自動累計empCount
    '''
    empCount = 0
    #定義物件剛建立後,預計初始化的流程。
    #self就是物件自己本身
    def __init__(self, name, salary):
        self.name = name
        self.yoursalary = salary
        Employee.empCount += 1
    #和一般python函數定義不同,類別內的method必須包含參數self,並且務必放在第一個參數位置
    def displayTotalEmpCount(self):
        print("Total Employee Count: %d" % self.empCount)
    def displayEmpInfo(self):
        print("Name:",self.name,"Salary:",self.yoursalary)

print("類別文件字串:", Employee.__doc__)
print("類別名稱:", Employee.__name__)
print("類別所屬模組:", Employee.__module__)
print("類別的父類別:", Employee.__bases__)
print("類別所屬命名空間字典:", Employee.__dict__)


有關於模組封裝到另一個py檔的手法
可把類別定義移植到另一隻python程式檔中定義
在python中模組名稱就是檔案名稱
引入方法如下
from somefile import *


在主程式中就去import進來就能直接使用



Python中繼承語法如下,父類別名稱寫在括號內。
class 子類別(父類別):

  • 父類別名稱除了是必須寫在子類別所處的py檔案內有定義之外
  • 也可採用"模組名稱.父類別名稱" 這寫法來去使用別的模組內的類別。
  • 於繼承中父類別初始化方法__init__() 不會自動被呼叫到,其需要於子類別中初始化方法中指定才會執行。
  • 若子類別當中無定義某個成員,就會自動往上一層父類別內成員定義去查找。如果該父類別也是某個類別的子類,則會一直延續此搜尋方式。
練習程式5-類別的繼承

class Parent:
    parentAttr = 100
    def __init__(self):
        print("父類別init")
    def parentMethod(self):
        print("父類別方法")
    def setAttr(self,attr):
        Parent.parentAttr = attr
    def getAttr(self):
        print("父類別成員:",Parent.parentAttr)
class Child(Parent):
    def __init__(self):
        print("子類別init")
    def childMethod(self):
        print("子類別方法")

c = Child()
c.childMethod()
c.parentMethod()
c.getAttr()
c.setAttr(200)
c.getAttr()






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義

鼎新ERP_會計系統_總帳管理_財務參數設定_傳票處理