【python】學(xué)習(xí)面向?qū)ο缶幊蹋ㄈ?/h1>

接上一文

  • 偽私有目的:
    防止外界直接訪問
    防止被子類同名稱屬性覆蓋
  • 為什么叫偽私有拧揽?
    print(Animal.__x)訪問不到
    但是——print(Animal._Animal__x)可以訪問到
  • 但還是不建議這么去訪問私有屬性

只讀屬性

  • 只能讀取止邮,不能寫入勃救,一般是實(shí)例屬性

設(shè)置方法一

  • 內(nèi)置方法去讀取
class Person:
  def __init__(self):
    self.__age=18 #不能訪問了
  
  def getAge(self):
    return self.__age #這樣就可以讀取

p1=Person()
print(p1.__age) #不行 報(bào)錯(cuò)
print(p1.getAge()) #可以

設(shè)置方法二

class Person:
  def __init__(self):
    self.__age=18 #不能訪問了

  #作用:可以以使用屬性讀取的方式來使用這個(gè)方法
 @property
  def getAge(self):
    return self.__age #這樣就可以讀取

p1=Person()
print(p1.age) #可以
p1.age=666 #不可以

對于property的理解

  • 以讀取屬性的方式用方法

  • 可以將一些屬性的操作(刪、改、查)關(guān)聯(lián)到屬性中

  • 補(bǔ)充概念
    經(jīng)典類:沒有繼承object(類)
    新式類:繼承object
    在python3里面直接定義一類涂召,直接默認(rèn)定義的是新式類麻捻,繼承object

在新式類的使用方式

class Person(object):
  def __init__(self):
    self.__age=18
 
  def get_age(self):
    return self.__age

  def set_age(self,value):
    self.__age=value

  
   age=property(get_age, set_age)

p=Person()
print(p.age)  #可以獲取age,18

p.age=90
print(p.age) #90

第二種使用方式

class Person(object):
  def __init__(self):
    self.__age=18

  @property
  def age(self):
    return self.__age
  @age.setter
  def age(self,value):
    self.__age=value


p=Person()
print(p.age) #18

p.age=10
print(p.age) #10

在經(jīng)典類中的使用方式

  • 首先要將版本換成python2兼蕊,否則定義類之后默認(rèn)繼承object初厚,即是新式類,沒法定義成經(jīng)典類
class Person:
  def __init__(self):
    self.__age=18
 
  def get_age(self):
    return self.__age

  def set_age(self,value):
    self.__age=value

  
   age=property(get_age, set_age)

p=Person()
print(p.age) #18

p.age=19
print(p.age) #19
#但是這個(gè)值為19的age是一個(gè)新的變量,不是原來的類里面的__age的值改為了19

  • 裝飾器的方式
class Person:
  def __init__(self):
    self.__age=18

  @property
  def age(self):
    print '---get'
    return self.__age
 
 @age.setter
 def age(self,value):
    self.__age=value

p=Person()
print p.age #---get 18

p.age=19
print p.age #19
print p.__dict__ #{'age':19,'_Person__age':18}
  • 這里要告訴我們的是:
    在經(jīng)典類里面設(shè)置age值是可以做的产禾,但是這樣做的并不是對__age值的改變排作,只是添加了多一個(gè)值age
  • 切記這一現(xiàn)象
  • 建議以后都使用新式類

用系統(tǒng)內(nèi)置的方法設(shè)置只讀屬性

  • 剛剛提到的方式設(shè)置只讀屬性還是有漏洞,因?yàn)槠鋵?shí)還是有辦法可以修改只讀屬性
p1._Person__age = 999
p1.__dict__['_Person__age']=999
  • 因此我們提出:__setattr__的使用
class Person:
  #當(dāng)我們通過實(shí)例.屬性 =值亚情,給一個(gè)實(shí)例增加一個(gè)屬性妄痪,或者說,修改一下屬性值的時(shí)候楞件,都會(huì)調(diào)用這個(gè)方法
  #在這個(gè)方法內(nèi)部衫生,才會(huì)真正把這個(gè)屬性以及對應(yīng)的值給存儲(chǔ)到__dict__字典里面
  def __setattr__(self, key, value):
    print(key, value)

p1=Person()
p1.age=18 # age 18

print(p1.age) #報(bào)錯(cuò)
print(p1.__dict__) #{}
  • 這里告訴我們實(shí)例p1并沒有獲得age屬性
class Person:
  #當(dāng)我們通過實(shí)例.屬性 =值,給一個(gè)實(shí)例增加一個(gè)屬性土浸,或者說罪针,修改一下屬性值的時(shí)候泪酱,都會(huì)調(diào)用這個(gè)方法
  #在這個(gè)方法內(nèi)部,才會(huì)真正把這個(gè)屬性以及對應(yīng)的值給存儲(chǔ)到__dict__字典里面
  def __setattr__(self, key, value):
    print(key, value)

    #1.判定还最,key墓阀,是否是我們要設(shè)置的只讀屬性的名稱
    if key=='age':
      print('這個(gè)屬性是只讀屬性,不能設(shè)置數(shù)據(jù)')
    #2 .如果不是拓轻,只讀屬性的名次斯撮,真正的給它添加到這個(gè)實(shí)例里面去
     else:
      self.__dict__[key]=value

p1=Person() # age 18
p1.age=18 # 這個(gè)屬性是只讀屬性,不能設(shè)置數(shù)據(jù)
print(p1.__dict__) #{}
p1.name='sz' # name sz
print(p1.__dict__) #{'name':'sz'}
  • 可以添加屬性name扶叉,不能添加屬性age
  • 下面再在if條件里多加一個(gè)and條件
  • 添加這條條件之后在第一次添加屬性age的時(shí)候可以添加
  • 但后來不能在修改了吮成,是只讀屬性
class Person:
  #當(dāng)我們通過實(shí)例.屬性 =值,給一個(gè)實(shí)例增加一個(gè)屬性辜梳,或者說粱甫,修改一下屬性值的時(shí)候,都會(huì)調(diào)用這個(gè)方法
  #在這個(gè)方法內(nèi)部作瞄,才會(huì)真正把這個(gè)屬性以及對應(yīng)的值給存儲(chǔ)到__dict__字典里面
  def __setattr__(self, key, value):
    print(key, value)

    #1.判定茶宵,key,是否是我們要設(shè)置的只讀屬性的名稱
    if key=='age' and key in self.__dict__.keys():
      print('這個(gè)屬性是只讀屬性宗挥,不能設(shè)置數(shù)據(jù)')
    #2 .如果不是乌庶,只讀屬性的名次,真正的給它添加到這個(gè)實(shí)例里面去
     else:
      self.__dict__[key]=value

p1=Person() # age 18
p1.age=18 # 18
print(p1.__dict__) #{'age':18}

p1.age=999# age 999
#這個(gè)屬性只是只讀屬性契耿,不能設(shè)置數(shù)據(jù)
p1.age=18 # 18
print(p1.__dict__) #{'age':18}

系統(tǒng)內(nèi)置的特殊屬性

  • 創(chuàng)建好類之后自動(dòng)就有的一些屬性
  • __dict__:類的屬性
    __bases__:類的所有父類構(gòu)成元組
    __doc__:類的文檔字符串
    __name__:類名
    __model__:類定義所在的模塊

一瞒大、類屬性

class Person:
  """ 
  這是一個(gè)人,類
  """
  age =19
  def __init__(self):
    self.name='sz'

  def run(self):
    print('run')

print(Person.__dict__) #輸出好多東西的字典搪桂,有__model__透敌,有age盯滚,有run等等
print(Person.__bases__) # (<class 'object'>,)
print(Person.__doc__) #這是一個(gè)人,類
print(Person.__name__) # Person
pritn(Person.__module__) #__main__

二酗电、實(shí)例屬性

  • __class__
class Person:
  """ 
  這是一個(gè)人魄藕,類
  """
  age =19
  def __init__(self):
    self.name='sz'

  def run(self):
    print('run')

p=Person()
print(p.__class__) #<class '__main__>Person'>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撵术,隨后出現(xiàn)的幾起案子背率,更是在濱河造成了極大的恐慌,老刑警劉巖嫩与,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝姿,死亡現(xiàn)場離奇詭異,居然都是意外死亡划滋,警方通過查閱死者的電腦和手機(jī)饵筑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古毛,“玉大人翻翩,你說我怎么就攤上這事都许〉巨保” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵胶征,是天一觀的道長塞椎。 經(jīng)常有香客問我,道長睛低,這世上最難降的妖魔是什么案狠? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钱雷,結(jié)果婚禮上骂铁,老公的妹妹穿的比我還像新娘。我一直安慰自己罩抗,他們只是感情好拉庵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著套蒂,像睡著了一般钞支。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上操刀,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天烁挟,我揣著相機(jī)與錄音,去河邊找鬼骨坑。 笑死撼嗓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播静稻,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼警没,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了振湾?” 一聲冷哼從身側(cè)響起杀迹,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎押搪,沒想到半個(gè)月后树酪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡大州,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年续语,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦画。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疮茄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出根暑,到底是詐尸還是另有隱情力试,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布排嫌,位于F島的核電站畸裳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淳地。R本人自食惡果不足惜怖糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颇象。 院中可真熱鬧伍伤,春花似錦、人聲如沸遣钳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耍贾。三九已至阅爽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荐开,已是汗流浹背付翁。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晃听,地道東北人百侧。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓砰识,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佣渴。 傳聞我的和親對象是個(gè)殘疾皇子辫狼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354