Python中欄位(屬性)、方法、特性的區別
阿新 • • 發佈:2019-02-04
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!