1. 程式人生 > >類屬性、例項屬性,靜態方法和類方法

類屬性、例項屬性,靜態方法和類方法

類屬性、例項屬性
在瞭解了類基本的東西之後,下面看一下python中這幾個概念的區別

先來談一下類屬性和例項屬性

在前面的例子中我們接觸到的就是例項屬性(物件屬性),顧名思義,類屬性就是類物件所擁有的屬性,它被所有類物件的例項物件所共有,在記憶體中只存在一個副本,這個和C++中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件和例項物件訪問

類屬性
class People(object):
name = ‘Tom’ #公有的類屬性
__age = 12 #私有的類屬性

p = People()

print(p.name) #正確
print(People.name

) #正確
print(p.__age) #錯誤,不能在類外通過例項物件訪問私有的類屬性
print(People.__age) #錯誤,不能在類外通過類物件訪問私有的類屬性
例項屬性(物件屬性)
class People(object):
address = ‘山東’ #類屬性
def init(self):
self.name = ‘xiaowang’ #例項屬性
self.age = 20 #例項屬性

p = People()
p.age =12 #例項屬性
print(p.address) #正確
print(p.name) #正確
print(p.age) #正確

print(People.address) #正確
print(

People.name) #錯誤
print(People.age) #錯誤
通過例項(物件)去修改類屬性
class People(object):
country = ‘china’ #類屬性

print(People.country)
p = People()
print(p.country)
p.country = ‘japan’
print(p.country) #例項屬性會遮蔽掉同名的類屬性
print(People.country)
del p.country #刪除例項屬性
print(p.country)

在這裡插入圖片描述
總結
如果需要在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,會產生一個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且之後如果通過例項物件去引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性。

1. 類方法
是類物件所擁有的方法,需要用修飾器@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 = ‘china’

#類方法,用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(‘japan’)

print p.getCountry()
print People.getCountry()

在這裡插入圖片描述
結果顯示在用類方法對類屬性修改之後,通過類物件和例項物件訪問都發生了改變

  1. 靜態方法
    需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義引數

class People(object):
country = ‘china’

@staticmethod
#靜態方法
def getCountry():
    return People.country

print People.getCountry()
總結
從類方法和例項方法以及靜態方法的定義形式就可以看出來,類方法的第一個引數是類物件cls,那麼通過cls引用的必定是類物件的屬性和方法;而例項方法的第一個引數是例項物件self,那麼通過self引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。靜態方法中不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類物件來引用