Skip to content

Latest commit

 

History

History
165 lines (134 loc) · 5.88 KB

07-6 類別-類別變數.md

File metadata and controls

165 lines (134 loc) · 5.88 KB

07-6 類別(class)-類別變數(class variable)

在類別中宣告的變數是類別變數(並非宣告在方法的區域變數). 類別變數是類別的屬性, 如果用[類別名稱.變數名稱]取存, 會生成一個靜態變數(記憶體中只有一份); 如果用[self.變數名稱]取存, 則會生成self所指那個實例的變數(每個實例各自有一份).

(1)程式範例(宣告一個Student.depts的類別變數)

ntub.py
#------------------------------------------------
# 定義學生類別
#------------------------------------------------
class Student():
    #============================================     
    # 類別變數, 以Student.depts取存=>產生靜態變數       
    #          以self.depts取存.  =>產生實體變數
    #============================================
    depts=['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
    
    #------------------------------       
    # 建構元
    #------------------------------   
    def __init__(self, stuNo, stuName, deptNo=None):
        self.stuNo=stuNo
        self.stuName=stuName
        self.deptNo=deptNo        

    #----------------------------------    
    # 取用deptNo屬性的方法
    #---------------------------------- 
    @property
    def deptNo(self):
        return self._deptNo

    #----------------------------------    
    # 寫入deptNo屬性的方法
    #---------------------------------- 
    @deptNo.setter
    def deptNo(self, deptNo):
        if deptNo in ['1', '2', '3', '4', '5', '6', '7', 'A', 'B', 'C']:
            self._deptNo=deptNo
        else:
            self._deptNo=None

    #==================================    
    # 取出系名的方法
    # (取用類別變數)
    #==================================  
    def department(self):
        if self._deptNo != None:
            if self._deptNo >= 'A':
                return Student.depts[ord(self._deptNo)-ord('A')+7]
            else:
                return Student.depts[ord(self._deptNo)-ord('1')]
        else:
            return None   
main.py
#---------------------------
# 匯入ntub模組
#---------------------------
import ntub

#---------------------------
# 將建成物件的原始資料
#---------------------------
data=[('10556001', '王小明', '6'), ('10552002', '陳小華', '2'), ('1055A003', '李小強', 'A'), ('10557004', '張小文', 'C'), ('10551005', '周小芳', '8')]

#---------------------------
# 將放置多個物件的list
#---------------------------
students=[]

#-----------------------------------------
# 生成Student類別的實例, 將它加入list中
#-----------------------------------------
for d in data:    
    students.append(ntub.Student(d[0], d[1], d[2]))
    
#---------------------------
# 逐一呼叫各個物件的方法
#---------------------------    
for s in students:    
    print('學號:{}  姓名:{}  系別:{}  系名:{}'.format(s.stuNo, s.stuName, s.deptNo, s.department()))		

執行結果:

學號:10556001  姓名:王小明  系別:6  系名:資管系
學號:10552002  姓名:陳小華  系別:2  系名:財金系
學號:1055A003  姓名:李小強  系別:A  系名:商設系
學號:10557004  姓名:張小文  系別:C  系名:數媒系
學號:10551005  姓名:周小芳  系別:None  系名:None

(2)程式範例(用實例取用類別變數, 是取用各自的實體變數)

main.py
#---------------------------
# 匯入ntub模組
#---------------------------
import ntub

#---------------------------
# 將建成物件的原始資料
#---------------------------
data=[('10556001', '王小明', '6'), ('10552002', '陳小華', '2'), ('1055A003', '李小強', 'A'), ('10557004', '張小文', 'C'), ('10551005', '周小芳', '8')]

#---------------------------
# 將放置多個物件的list
#---------------------------
students=[]

#-----------------------------------------
# 生成Student類別的實例, 將它加入list中
#-----------------------------------------
for d in data:    
    students.append(ntub.Student(d[0], d[1], d[2]))
    

#-----------------------------------------
# 印出每個實例的實體變數
#-----------------------------------------
for d in students:
    print(d.depts)
    
print('-'*40)   

#-----------------------------------------
# 改變第1個實例的實體變數
#-----------------------------------------
students[0].depts=[1,2,3]

#-----------------------------------------
# 印出每個實例的實體變數
#-----------------------------------------
for d in students:
    print(d.depts)
    
print('-'*40) 

執行結果:

['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
----------------------------------------
[1, 2, 3]
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
['會資系', '財金系', '財稅系', '企管系', '商務系', '資管系', '應外系', '商設系', '商創系', '數媒系']
----------------------------------------