熱線電話:13121318867

登錄
首頁精彩閱讀Python中的類屬性、實例屬性與類方法、靜態方法
Python中的類屬性、實例屬性與類方法、靜態方法
2018-03-23
收藏

Python中的類屬性、實例屬性與類方法、靜態方法

1、什么是類對象,實例對象
類對象:類名
實例對象:類創建的對象
2、類屬性就是類對象所擁有的屬性,它被所有類對象的實例對象所共有,在內存中只存在一個副本,這個和C++、Java中類的靜態成員變量有點類似。對于公有的類屬性,在類外可以通過類對象和實例對象訪問
類屬性
[java] view plain copy
    # 類屬性  
    class people:  
        name="Tom"    #公有的類屬性  
        __age=18      #私有的類屬性  
      
    p=people()  
    print(p.name)   #實例對象  
    print(people.name)  #類對象  
      
    # print(p.__age)    #錯誤 不能在類外通過實例對象訪問私有的類屬性  
    print(people.__age) #錯誤 不能在類外同過類對象訪問私有的類屬性 
實例屬性
[java] view plain copy

    class people:  
        name="tom"  
      
    p=people()  
    p.age=18  
      
    print(p.name)  
    print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
      
    print(people.name)  
    #print(people.age)  #錯誤:實例屬性,不能通過類對象調用 
也可以將實例屬性放在構造方法中
[java] view plain copy

    class people:  
        name="tom"  
        def  __init__(self,age):  
            self.age=age  
      
    p=people(18)  
      
    print(p.name)  
    print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
      
    print(people.name)  
    # print(people.age)  #錯誤:實例屬性,不能通過類對象調用 
類屬性和實例屬性混合
[java] view plain copy

    class people:  
        name="tom"      #類屬性:實例對象和類對象可以同時調用  
        def  __init__(self,age):    #實例屬性  
            self.age=age  
      
    p=people(18)    #實例對象  
    p.sex="男"       #實例屬性  
      
    print(p.name)  
    print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
    print(p.sex)  
      
    print(people.name)  #類對象  
    # print(people.age)  #錯誤:實例屬性,不能通過類對象調用  
    # print(people.sex)  #錯誤:實例屬性,不能通過類對象調用 
# 如果在類外修改類屬性,必須通過類對象去引用然后進行修改。如果通過實例對象去引用,
# 會產生一個同名的實例屬性,這種方式修改的是實例屬性,不會影響到類屬性,并且如果通過
# 實例對象引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性
[java] view plain copy

    class Animal:  
        name="Panda"  
      
    print(Animal.name)  #類對象引用類屬性  
    p=Animal()  
    print(p.name)       #實例對象引用類屬性時,會產生一個同名的實例屬性  
    p.name="dog"        #修改的只是實例屬性的,不會影響到類屬性  
    print(p.name)         #dog  
    print(Animal.name)    #panda  
      
    # 刪除實例屬性  
    del p.name  
    print(p.name) 
[java] view plain copy

    class Test:  
      
        num=100 #類屬性  
        def __init__(self):  
            self.age=18     #實例屬性  
      
    test1=Test()  
    test2=Test()  
    # test1.age=19  
    # test2.age=20  
    print(test1.num)    #100  
    test1.num=200       #如果通過對象去修改類屬性,那么Python會自動給這個對象和這個類屬性相同名字的實例屬性  
    print(test1.num)    #200,只是修改了副本  
    print(Test.num)     #100  
      
    del test1.num        #刪除之后,仍能打印  
    print(test1.num) 
3、類方法
是類對象所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對于類方法,第一個參數必須是類對象,一般以cls作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部分人都習慣以'cls'作為第一個參數的名字,就最好用'cls'了),能夠通過實例對象和類對象去訪問。
[java] view plain copy

    class people:  
        country="china"  
      
        @classmethod  
        def getCountry(cls):  
            return cls.country  
      
    p=people()  
    print(p.getCountry())   #實例對象調用類方法  
    print(people.getCountry())  #類對象調用類方法 
類方法還有一個用途就是可以對類屬性進行修改:
[java] view plain copy

    class people:  
        country="china"  
      
        @classmethod  
        def getCountry(cls):  
            return cls.country  
        @classmethod  
        def setCountry(cls,country):  
            cls.country=country  
      
      
    p=people()  
    print(p.getCountry())   #實例對象調用類方法  
    print(people.getCountry())  #類對象調用類方法  
      
    p.setCountry("Japan")  
      
    print(p.getCountry())  
    print(people.getCountry()) 
4、靜態方法
需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義參數
[java] view plain copy

    class people3:  
        country="china"  
      
        @staticmethod  
        def getCountry():  
            return people3.country  
      
    p=people3()  
    print(p.getCountry())   #實例對象調用類方法  
    print(people3.getCountry())  #類對象調用類方法 
從類方法和實例方法以及靜態方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那么通過cls引用的必定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那么通過self引用的可能是類屬性、也有可能是實例屬性(這個需要具體分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先級更高。
靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引用

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢