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!