Python OOP-4

      網(wǎng)友投稿 618 2025-04-04

      8. 類的成員描述符(屬性)

      類的成員描述是為了在類中對類的成員屬性進(jìn)行相關(guān)操作而創(chuàng)建的一種方式

      get:獲取屬性的操作

      set:修改或添加屬性操作

      delete:刪除屬性的操作

      如果想使用類的額成員描述符,大概有三種方法

      使用類實(shí)現(xiàn)描述器

      使用屬性修飾符

      使用property函數(shù)

      property函數(shù)很簡單

      property(fget, fset, fdel, doc)

      無論哪種修飾符都是為了對成員屬性進(jìn)行相應(yīng)的控制

      類的方式:適用多個(gè)類中的多個(gè)屬性共用同一個(gè)描述符

      property:適用當(dāng)前類中使用,可以控制一個(gè)類中多個(gè)屬性

      屬性修飾符:適用于當(dāng)前類中使用,控制一個(gè)類中的一個(gè)屬性

      9. 類的內(nèi)置屬性

      __dict__: 以字典的方式顯示類的成員組成 __doc__: 獲取類的文檔信息 __name__: 獲取類的名稱,如果在模塊中使用,獲取模塊的名稱 __bases__: 獲取某個(gè)類的所有父類,以元組的方式顯示

      10. 類的常用魔術(shù)方法

      魔術(shù)方法就是不需要人為調(diào)用的方法,基本是在特定的時(shí)間自動觸發(fā)

      魔術(shù)方法的統(tǒng)一特征,方法名被前后各兩個(gè)下劃線包裹

      操作類

      __init__:構(gòu)造函數(shù)

      __new__:對象實(shí)例化方法,此魔術(shù)方法較特殊,一般不需要使用

      __call__:對象當(dāng)函數(shù)使用的時(shí)候觸發(fā)

      __str__:當(dāng)對象被當(dāng)作字符串使用的時(shí)候

      __repr__:返回字符串

      描述符相關(guān)

      __set__

      __get__

      __delete__

      屬性操作相關(guān)

      __getattr__:訪問一個(gè)不存在的屬性時(shí)觸發(fā)

      __setattr__:對成員屬性進(jìn)行設(shè)置的時(shí)候觸發(fā)

      參數(shù):

      self用來獲取當(dāng)前對象

      被設(shè)置的屬性名稱,以字符串形式出現(xiàn)

      需要對屬性名稱設(shè)置的值

      作用:進(jìn)行屬性設(shè)置的時(shí)候進(jìn)行驗(yàn)證或者修改

      注意:在該方法中不能對屬性進(jìn)行賦值操作,否則死循環(huán)

      運(yùn)算類相關(guān)魔術(shù)方法

      __gt__:進(jìn)行大于判斷的時(shí)候觸發(fā)的函數(shù)

      參數(shù)

      self

      第二個(gè)參數(shù)是第二個(gè)對象

      返回值可以是任意值,推薦返回布爾值

      11. 類和對象的三種方法

      實(shí)例方法

      需要實(shí)例化對象才能使用的方法,使用過程中可能需要截至對象的其他對象的方法完成

      靜態(tài)方法

      不需要實(shí)例化,通過類直接訪問

      類方法

      不需要實(shí)例化

      # 屬性案例 # 創(chuàng)建Student類,描述學(xué)生類 # 學(xué)生具有Student.name屬性 # 但name格式并不統(tǒng)一 # 可以用增加一個(gè)函數(shù),然后自動調(diào)用的方式,但很蠢 class Student(): def __init__(self, name, age): self.name = name self.age = age # 如果不想修改代碼 self.setName(name) # 介紹下自己 def intro(self): print("Hai, my name is {0}".format(self.name)) def setName(self, name): self.name = name.upper() s1 = Student("RUO Chen", 19.8) s2 = Student("michi stangle", 24.0) s1.intro() s2.intro()

      Hai, my name is RUO CHEN Hai, my name is MICHI STANGLE

      # propertya 案例 # 定義一個(gè)Person類,具有name,age屬性 # 對于任意輸入的姓名,我們希望用大寫方式保存 # 年齡,我們希望內(nèi)部統(tǒng)一用整數(shù)保存 # x = property(fget, fset, fdel, doc) class Person(): ''' 這是一個(gè)人,一個(gè)高尚的人,一個(gè)脫離了低俗趣味的人 他還他媽的有屬性 ''' # 函數(shù)名稱可以任意 def fget(self): return self._name * 2 def fset(self, name): # 所有輸入的姓名以大寫方式 保存 self.name = name.upper() def fdel(self): self._name = "NoName" name = property(fget, fset, fdel, "對name進(jìn)行操作")

      # 類的內(nèi)置屬性舉例 print(Person.__dict__) print(Person.__doc__) print(Person.__name__) # 元組形式顯示所有的父類 print(Person.__bases__)

      {'__module__': '__main__', '__doc__': '\n 這是一個(gè)人,一個(gè)高尚的人,一個(gè)脫離了低俗趣味的人\n 他還他媽的有屬性\n ', 'fget': , 'fset': , 'fdel': , 'name': , '__dict__': , '__weakref__': } 這是一個(gè)人,一個(gè)高尚的人,一個(gè)脫離了低俗趣味的人 他還他媽的有屬性 Person (,)

      # init 舉例 class A(): def __init__(self, name = 0): print("哈哈,我被調(diào)用了") a = A()

      哈哈,我被調(diào)用了

      # __call__ 舉例 class A(): def __init__(self, name = 0): print("哈哈,我被調(diào)用了") def __call__(self): print("我被調(diào)用again") a = A() a()

      哈哈,我被調(diào)用了 我被調(diào)用again

      # __str__ 舉例 class A(): def __init__(self, name = 0): print("哈哈,我被調(diào)用了") def __call__(self): print("我被調(diào)用again") def __str__(self): return '666' a = A() print(a)

      哈哈,我被調(diào)用了 666

      # __getattr__ class A(): name = "NoName" age = 18 def __getattr__(self, name): print("沒找到") print(name) a = A() print(a.name) print(a.addr)

      NoName 沒找到 addr None

      # __setattr__ 案例 class Person(): def __init__(self): pass def __setattr__(self, name, value): print("設(shè)置屬性:{0}".format(name)) # 下面語句會導(dǎo)致問題,死循環(huán) # self.name = value # 此種情況,為了避免死循環(huán),規(guī)定統(tǒng)一調(diào)用父類魔法函數(shù) super().__setattr__(name, value) p = Person() print(p.__dict__) p.age = 18

      {} 設(shè)置屬性:age

      # __gt__ class Student(): def __init__(self, name): self._name = name def __gt__(self, obj): print("哈哈,{0} 會比 {1} 大嗎?".format(self, obj)) return self._name > obj._name stu1 = Student("one") stu2 = Student("two") print(stu1 > stu2)

      哈哈,<__main__.Student object at 0x000001C15772EB38> 會比 <__main__.Student object at 0x000001C15772E550> 大嗎? False

      # 三種方法的案例 class Person(): # 實(shí)例方法 def eat(self): print(self) print("Eating......") # 類方法 # 類方法的第一個(gè)參數(shù),一般命名為cls,區(qū)別于self @classmethod def play(cls): print(cls) print("Playing......") # 靜態(tài)方法 # 不需要用第一個(gè)參數(shù)表示自身或者類 @staticmethod def say(): print("Saying......") yueyue = Person() # 實(shí)例方法 yueyue.eat() # 類方法 Person.play() yueyue.play() # 靜態(tài)方法 Person.say() yueyue.say()

      <__main__.Person object at 0x000001C157766710> Eating...... Playing...... Playing...... Saying...... Saying......

      Python OOP-4

      Python 面向?qū)ο缶幊?/p>

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:企業(yè)生產(chǎn)管理MES軟件,提高生產(chǎn)效率的利器!
      下一篇:Excel2013中怎么隔幾行就插入空行(excel每隔十行插一行空行)
      相關(guān)文章
      亚洲区小说区图片区QVOD| 久久影院亚洲一区| 亚洲精品成人网站在线观看 | 亚洲国产精品碰碰| 色偷偷亚洲第一综合| 亚洲精品乱码久久久久久V | 国产AV无码专区亚洲AVJULIA| 日韩一卡2卡3卡4卡新区亚洲 | 亚洲一区在线免费观看| 亚洲一级毛片免费在线观看| 亚洲一区二区三区在线观看蜜桃 | 国产精品亚洲片在线va| 色老板亚洲视频免在线观| 亚洲日本乱码卡2卡3卡新区| 亚洲精品综合在线影院| 亚洲日韩AV一区二区三区中文 | 亚洲最大天堂无码精品区| 亚洲人AV在线无码影院观看| 亚洲欧美综合精品成人导航| 久久久久亚洲AV无码去区首| 亚洲福利视频一区二区| 国产黄色一级毛片亚洲黄片大全 | 亚洲最大AV网站在线观看| 亚洲乱码中文字幕久久孕妇黑人| 亚洲精品字幕在线观看| 亚洲av鲁丝一区二区三区| 91精品国产亚洲爽啪在线观看| 亚洲精品第五页中文字幕| 亚洲一区中文字幕在线电影网 | 亚洲国产无线乱码在线观看| 老司机亚洲精品影院在线观看| 亚洲AⅤ优女AV综合久久久| 亚洲综合色自拍一区| 亚洲成色www久久网站夜月| 久久亚洲精精品中文字幕| 精品亚洲成A人无码成A在线观看| 亚洲熟女精品中文字幕| 日韩亚洲精品福利| 亚洲男同帅GAY片在线观看| 91情国产l精品国产亚洲区| 国产精品亚洲精品青青青|