天天看點

Python中字段(屬性)、方法、特性的差別

Python中字段(屬性)、方法、特性的差別:

Num01–>字段

分類:類屬性和執行個體屬性

類屬性:類屬性就是類對象所擁有的屬性,它被所有類對象的執行個體對象所共有,在記憶體中隻存在一個副本。對于公有的類屬性,在類外可以通過類對象和執行個體對象通路。

執行個體屬性:執行個體屬性就是執行個體對象所擁有的屬性。           
class People(object):
    country = 'name' #類屬性

print(People.country)
p = People()
print(p.country)
p.country = 'xiaoke' 
print(p.country)      #執行個體屬性會屏蔽掉同名的類屬性
print(People.country)
del p.country    #删除執行個體屬性
print(p.country)           

小總結:

1,如果需要在類外修改類屬性,必須通過執行個體對象去調用類方法中設定屬性方法進行修改。

2,如果通過執行個體對象去引用,會産生一個同名的執行個體屬性,這種方式修改的是執行個體屬性,不會影響到類屬性,并且之後如果通過執行個體對象去引用該名稱的屬性,執行個體屬性會強制屏蔽掉類屬性,即引用的是執行個體屬性,除非删除了該執行個體屬性。

3,但是當你删除執行個體屬性後,再使用相同的名稱,通路到的将是類屬性。
           

Num02–>方法

分類:類方法,靜态方法,一般方法

類方法:

    是類對象所擁有的方法,需要用修飾器@classmethod來辨別其為類方法,對于類方法,第一個參數必須是類對象,一般以cls作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部分人都習慣以'cls'作為第一個參數的名字,就最好用'cls'了),能夠通過執行個體對象和類對象去通路。

class People(object):
   country = 'china'

   #類方法,用classmethod來進行修飾
   @classmethod
   def getCountry(cls):
       return cls.country

p = People()
print p.getCountry()    #可以用過執行個體對象引用
print People.getCountry()    #可以通過類對象引用
           
類方法的其中一個作用就是:可以對類屬性進行修改。

class People(object): 
    country = 'python'
     #類方法,用classmethod來進行修飾     
    @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('xiaoke') 
print(p.getCountry()) 
print(People.getCountry())           
靜态方法:

    需要通過修飾器@staticmethod來進行修飾,靜态方法不需要多定義參數

class People(object): 
    country = 'python'     
    @staticmethod #靜态方法
    def getCountry(): 
        return People.country

#必須通過類對象調用靜态方法
print(People.getCountry())           

靜态方法和類方法的總結:

從類方法和執行個體方法以及靜态方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那麼通過cls引用的必定是類對象的屬性和方法;

而執行個體方法的第一個參數是執行個體對象self,那麼通過self引用的可能是類屬性、也有可能是執行個體屬性(這個需要具體分析),不過在存在相同名稱的類屬性和執行個體屬性的情況下,執行個體屬性優先級更高。

靜态方法中不需要額外定義參數,是以在靜态方法中引用類屬性的話,必須通過類對象來引用

Num03–>特性

定義:

1,Python内置的@property裝飾器,就是負責把類方法變成隻讀屬性調用的。這種方法變屬性,就是特性。

2,既能檢查參數,又可以用類似屬性這樣簡單的方式來通路類的變量。
           
class Student(object):

    # 隻讀,類似于get方法
    @property
    def Att(self):
        return self._score

    # 隻寫,類似于set方法
    @Att.setter
    def Att(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.Att = 88 # OK,實際轉化為s.set_score(60)
print(s.Att) # OK,實際轉化為s.get_score()

s.Att = 999999#隻接抛出異常了,異常如下:

# ValueError: score must between 0 ~ 100!           

繼續閱讀