1. 程式人生 > >Python中欄位(屬性)、方法、特性的區別

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!