私有屬性是以**雙下劃線』__』**開頭的屬性。
在外部訪問私有屬性將會丟擲異常,提示沒有這個屬性。
雖然私有屬性無法從外部訪問,但是,從類的內部是可以訪問的。私有屬性是為了保護類或例項屬性不被外部汙染而設計的。
更多私有屬性的讀取修改參考新增鏈結描述
lass person(
object):
def__init__
(self, name, ***, age)
: self.__name = name
self.__*** = ***
self.__age = age
defget_name
(self)
:return self.__name
defset_name
(self, name)
: self.__name = name
defget_***
(self)
:return self.__***
defset_***
(self, ***)
: self.__*** = ***
defget_age
(self)
:return self.__age
defset_age
(self, age)
: self.__age = age
defget_info
(self)
:print
(self.get_name(
), self.get_***(
), self.get_age())
xiaoming = person(
'xiaoming'
,'m',20
)xiaoming.set_age(18)
xiaoming.get_info(
)輸出-
->xiaoming m 18
例項的方法指的就是在類中定義的函式,例項方法的第乙個引數永遠都是self,self是乙個引用,指向呼叫該方法的例項物件本身,除此以外,其他引數和普通函式是完全一樣的。
在外部呼叫例項方法時,是不需要顯式傳遞self引數的。另外,通過定義例項方法來操作私有屬性的這種方法是推薦的,這種資料封裝的形式除了能保護內部資料一致性外,還可以簡化外部呼叫的難度。當然,例項方法並不僅僅是為私有屬性服務的,我們可以把和類的例項有關的操作都抽象成例項方法,比如:列印例項的詳細資訊等等。
為了操作例項物件的私有屬性,我們定義了例項方法;同樣的,如果需要需要操作類的私有屬性,則應該定義類的方法。
class
person
(object):
__count =
0def
__init__
(self, name, ***, age)
: self.name = name
self.*** = ***
self.age = age
person.__count +=
1print
("%i"
%(person.__count)
)'''@classmethod:類方法的標誌'''
@classmethod
defgetcount
(cls)
:return cls.__count
@classmethod
defsetcount
(cls, count)
: cls.__count = count
defget_count
(self)
:return self.__count
defset_count
(self, count)
: self.__count = count
xiaoming = person(
'xiaoming'
,'m',18
)xin = person(
'xin'
,'f',18
)print
(xiaoming.name, xiaoming.***, xiaoming.age)
print
(xin.name, xin.***, xin.age)
##下面這一行屬於例項物件通過呼叫例項方法使用私有屬性
xin.set_count(3)
print
("the number of objects is %i"
%(xin.get_count())
)print
("the number of objects is %i"
%(xiaoming.get_count())
)print
("the number of objects is %i"
%(xin.getcount())
)print
("the number of objects is %i"
%(xiaoming.getcount())
)'''注釋的這一行執行報錯,說明例項物件方法只能由例項物件呼叫,但是類方法既可以被類呼叫也可以被例項物件呼叫。'''
# print("the number of objects is %i" % (person.get_count()))
print
("the number of objects is %i"
%(person.getcount())
)print
("類通過類方法使用私有屬性"
)person.setcount(5)
print
("the number of objects is %i"
%(xin.get_count())
)print
("the number of objects is %i"
%(xiaoming.get_count())
)print
("the number of objects is %i"
%(xin.getcount())
)print
("the number of objects is %i"
%(xiaoming.getcount())
)print
("the number of objects is %i"
%(person.getcount())
)
輸出:
由結果看出,通過例項方法使用類私有屬性,與通過例項方法使用例項物件私有屬性效果一樣。如果例項物件沒有通過例項方法修改類私有屬性,則例項物件獲取的類私有屬性的值就是該類獲取的類私有屬性的值
和例項方法不同的是,這裡有兩點需要特別注意:
1.類方法需要使用@classmethod來標記為類方法,否則定義的還是例項方法
2.類方法的第乙個引數將傳入類本身,通常將引數名命名為 cls,上面的 cls.__localtion 實際上相當於person.__localtion。
因為是在類上呼叫,而非例項上呼叫,因此類方法無法獲得任何例項變數,只能獲得類的引用
python科技限制 python 訪問限制
class person object def run self print self.money print run def eat self,food print eat food def init self,name,age,height,weight,money self.name name...
Python訪問限制
我們可以給乙個例項繫結很多屬性,如果有些屬性不希望被外部訪問到怎麼辦?python對屬性許可權的控制是通過屬性名來實現的,如果乙個屬性由雙下劃線開頭 該屬性就無法被外部訪問。看例子 class person object def init self,name self.name name self....
Python 訪問限制
內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線 在python中,例項的變數名如果以 開頭,就變成了乙個私有變數 private 只有內部可以訪問,外部不能訪問 class student object def init self,name,score self.name name self...