類屬性和實例屬性
- 類屬性:在Python中我們可以通過類名直接訪問的屬性,可分爲公有類屬性和私有類屬性(類似於Java中的靜態成員變量),公有屬性可直接訪問,而私有屬性則要通過自定義的get和set方法來訪問(對象來調用get與set方法)。
- 實例屬性:實例對象(通過類創建的對象)擁有的屬性,通過類名無法直接訪問。對象可以在外部給直接添加屬性(不建議使用,因爲對象屬性應該封裝在類的內部,否則容易產生一些隱式錯誤),這個屬性也叫實例屬性。通常來講,實例屬性都在初始化方法
__init()
內部定義並且由傳入的參數賦值(類似Java中的構造方法)。 - 需要注意的是,對象訪問類屬性不會對原類屬性造成影響,因爲當實例化對象後,內存中會給這個對象分配一片空間,因此這個對象訪問的類屬性是自己這片空間的類屬性(相當於副本),所以通過對象直接來改變類屬性是無法對原類屬性產生影響的。
class people:
name = "tom" # 類屬性
__height = 180
def __init__(self, age):
self.age = age # 實例屬性
def getHeight(self):
return self.__height
def setHeight(self,height):
self.__height = height
print("通過類名訪問:" + people.name)
p = people(20)
p.name="max"
p.setHeight(190)
print("通過對象訪問:%s %d %d"%(p.name,p.age,p.getHeight()))
print("通過類名訪問:" + people.name) #p.name="max"並沒有影響到原類屬性
結果:
類方法,實例方法和靜態方法
- 類方法:類對象所擁有的方法,需要用修飾器
@classmethod
來標識,第一個參數必須是類對象,一般以cls
作爲第一個參數(當然你也可以不叫cls
,這只是一種習慣與規範),能夠通過實例對象和對象(類名)去訪問。類方法可以讓實例對象去修改類屬性的值(上面已經講過,實例對象無法直接修改類屬性的值)
class people:
name = "tom" # 類屬性
def __init__(self, age):
self.age = age # 實例屬性
@classmethod
def setName(cls,name):
cls.name=name
p=people(20)
p.setName("max")
print(people.name)
結果:
- 實例方法:實例對象所擁有的方法,類對象無法訪問(不能直接通過類名調用)。第一個參數必須是實例對象,一般以
self
作爲第一個參數(同理,你也可以不叫self
,這只是一種習慣與規範),通過實例對象去調用。
class people:
name = "tom" # 類屬性
def __init__(self, age):
self.age = age # 實例屬性
def showAge(self):
print("年齡:%d"%(self.age))
p=people(20)
p.showAge()
結果:
- 靜態方法:需要通過修飾器
@staticmethod
,不需要定義參數,可以當做普通函數使用。
class people:
name = "tom" # 類屬性
def __init__(self, age):
self.age = age # 實例屬性
@staticmethod
def showAge():
print("姓名:"+people.name)
people.showAge()
p=people(20)
p.showAge()
結果: