1. 程式人生 > >Python(類屬性、類函式、靜態方法)筆記

Python(類屬性、類函式、靜態方法)筆記

版本:Python3.6.1

#coding = utf -8
"""
time:2018年4月2日 14:09:45
function:類
"""

"""
類屬性(類變數)
    定義位置:
        類裡面,類方法外
        
    特點:
        屬於類所有,所有物件共享一個變數
        
    訪問方式:
        成員變數訪問方式(回顧):
            類外訪問:
                物件名.屬性名
            類內訪問:
                self.屬性名
                
        類變數訪問方式:
            類外訪問:
                1.物件名.類屬性名(不推薦使用)
                    如果給類屬性名賦值,會先增加一個成員變數與類屬性名一致,類屬性不改變
                    如果獲取類屬性先找成員屬性,找不到再找類屬性
                    
                    注意:該方法可能會出現類屬性與成員屬性重名
                    
                2.類名.物件名
                    與成員變數無關,單純的類屬性操作
                    
            類內訪問:
                1.self.類屬性名
                2.類名.類屬性名
                
類方法
    語法:用@classmethod 描述,引數為cls
        @classmethod
        def xxx(cls):
            pass
            
    特徵:
        在類方法中,不能使用self關鍵字
        類方法屬於類所有,不同於成員方法屬於物件
    
    呼叫方法:
        1.類名.方法名()
        2.物件名.方法名()
        
    提示:
        一般情況下,工具類中的方法,使用類方法
            
    
靜態方法
    語法:用@staticmethod描述
        @staticmethod
        def xxx():
            pass
            
    特徵:
        沒有預設引數,沒有物件或類參與,等價於普通函式,比較少用
    
    訪問方式:
        1.類名.方法名()
        2.物件名.方法名()
        
    提示:
        此方法很少用,一般都會被普通函式代替

"""

class AA():
    classProperty = "我是類屬性"

    def __init__(self,a,b):
        self.a = a  #成員變數
        self.b = b

    def memberFun(self):    #成員方法
        print("a = %d , b = %d"%(self.a,self.b))
        print("self.classProperty = %s"%(self.classProperty))   #通過物件名.類屬性名訪問
        print("AA.classProperty = %s"%(AA.classProperty))   #通過類名.類屬

    @classmethod
    def classFun(cls,a_):  #類方法
        # print("a = %d , b = %d"%(cls.a,cls.b))  #無法使用,因為a b是成員變數,可以通過傳送物件訪問
        print("a = %d , b = %d"%(a_.a,a_.b))
        print("cls.classProperty = %s"%cls.classProperty)
        print("AA.classProperty = %s" % AA.classProperty)

    @staticmethod
    def staticFun(a_):
        print("a = %d , b = %d"%(a_.a,a_.b))
        print("AA.classProperty = %s" % AA.classProperty)


a = AA(1,2)
a1 = AA(3,4)
a.memberFun()
a.classFun(a)   #物件名.類方法

AA.classFun(a)  #類名.類方法
print("靜態方法訪問1:")
a.staticFun(a)
print("靜態方法訪問2:")
AA.staticFun(a)


print("---"*29)

print("a.classProperty = %s"%a.classProperty)
print("a1.classProperty = %s"%a1.classProperty)
print("AA.classProperty = %s"%AA.classProperty)

a.classProperty = "我是新增,賦值,並不是修改類屬性的值"
print("修改a.classproperty")
print("a.classProperty = %s"%a.classProperty)
print("a1.classProperty = %s"%a1.classProperty)
print("AA.classProperty = %s"%AA.classProperty)

AA.classProperty = "我是修改類屬性的值"
print("修改AA.classproperty")
print("a.classProperty = %s"%a.classProperty)   #這裡在上面已經添加了,只訪問到成員變數
print("a1.classProperty = %s"%a1.classProperty)
print("AA.classProperty = %s"%AA.classProperty)