python中特性attribute
-
特性是對象內部的變量
-
對象的狀態由它的特性來描述,對象的方法可以改變它的特性
-
可以直接從對象外部訪問特性
特性示例:
class Person: name = 'yoda' # 類中特性 def get_name(self): # 通過訪問器方法訪問特性 return self.name def set_name(self, value): # 通過訪問器方法改變特性 self.name = value 運行: A1 = Person() A1.name # 直接從外部訪問特性 yoda A1.name = 'master' # 直接從外部改變特性 默認情況下,python支持從外部對特性進行操作,但它破壞了類的封裝原則,要從外部對象無法訪問,應該使用私有特性。
python中私有化特性
為了讓外部無法訪問特性或方法,只要在名字前面加上雙下划線即可。
特性私有化示例:
class Secret: __name = 'yoda' # 加上雙下划線私有化特性 def get_name(self): return self.__name def __secret(self): # 私有化方法 print "can't find" def access(self): return self.__secret() # 訪問器訪問私有方法 A2 = Secret() A2.__name # 訪問不到特性! A2._Secret__name # 還是可以從外部訪問特性 yoda - python本質上並不完全支持私有化,只不過是將名字進行改變了
python中使用屬性(property)對特性進行訪問和設置
-
有一些面向對象語言支持私有特性,這些特性無法從外部直接訪問,需要編寫getter和setter方法對這些特性進行操作
-
python不需要getter和seter方法,因為python中所有特性都是公開的,如果不放心使用直接訪問對象的特性,可以為對象編寫setter和getter方法,但是更好的解決辦法是使用屬性(property)
- python隱藏訪問器的方法,讓所有特性看起來一樣,這種通過訪問器定義的特性被稱為屬性
屬性使用示例:
# 第一種方法使用屬性
class foo:
def __init__(self):
self.name = 'yoda'
self.work = 'master'
def get_person(self):
return self.name,self.work
def set_person(self,value):
self.name,self.work = value
person = property(get_person,set_person)
運行如下:
A3 = foo()
A3.person
('yoda', 'master')
A3.person = 'skylaer','programer'
A3.person
('skylaer','programer')
# 第二種方法使用屬性
class foo:
def __init__(self):
self.name = 'yoda'
self.work = 'master'
@property
def person(self):
return self.name,self.work
@person.setter # 如果不指定stter屬性,那么無法從類的外部對它的值進行設置,這對於只讀特性非常有用
def person(self,value):
self.name,self.work = value
-
property()第一個參數是getter方法,第二個參數是setter方法
-
property函數可以用0,1,2,3或者4個參數來調用,如果沒有參數,產生的屬性既不可讀,也不可寫,這四個參數分別叫做fget,fset,fel,fdoc,如果想要一個屬性是只寫的,並且有一個文檔字符串,能使用他們作為關鍵字參數