'''
封裝:
把亂七八糟的數據扔進列表里面,這是數據層面的封裝
把常用的代碼段打包成一個函數,這是語句層面的封裝
把數據和代碼打包成一個對象,這也是封裝
對象的特征稱為“屬性”,對象的行為稱為“方法”,即: 對象 = 屬性 + 方法
從代碼層面看,“屬性”就是變量,“方法”就是函數,將定義的這些稱為類(class)
對象叫做這個類的一個實例(instance),也叫實例對象(instance object)
'''
# 類名約定用大寫字母開頭,含 class 表明定義一個類
class Gm():
str = "這是一個類屬性(類變量)"
# 函數名用小寫字母開頭,含 def 表明定義一個函數
def instancefunc(self):
print("這是一個實例方法")
print(self)
@classmethod # 該裝飾器用來標識為類方法,可以訪問類屬性
def classfunc(cls): # 第一個參數必須是類對象(cls.)
print("這是一個類方法")
print(cls)
@staticmethod # 該裝飾器用來標識為靜態方法,不可以訪問類屬性
def staticfunc(): # 形參沒有 self 或 cls
print("這是一個靜態方法")
# Gm1(繼承類)是子類,Gm(被繼承的類)是基類、父類或超類。
# 一個子類可以繼承分類的任何屬性和方法。
# 若子類中定義與父類同名的方法或屬性,則會自動覆蓋父類對應的方法或屬性
class Gm1(Gm):
pass
# 調用
test = Gm() # 初始化一個Gm的對象(創建一個Gm對象),即test是Gm的實例對象
print(test)
print("**************************************")
test.instancefunc() # 對象調用實例方法
test.classfunc() # 對象調用類方法
test.staticfunc() # 對象調用靜態方法
print("**************************************")
print(test.str)
print("**************************************")
Gm.staticfunc() # 類調用靜態方法
Gm.classfunc() # 類調用類方法
Gm.instancefunc(test) # 類調用實例方法,需要帶參數

實例方法:
class Gm():
str = "這是一個類屬性(類變量)"
def __init__(self, st):
self.st = st
def instancefunc(self):
print("這是一個實例方法")
print(Gm.str)
print(self.st)
print(self.str)
print(self)
if __name__ == '__main__':
test = Gm("abc")
print(test)
print(test.str)
print(test.st)
test.instancefunc()

