久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python進(jìn)階知識(shí)

 nxhujiee 2023-04-24 發(fā)布于寧夏

二、面向?qū)ο缶幊?/a>

oop三大特征:繼承,、多態(tài),、封裝

1、概念

面向過程:一開始學(xué)習(xí)的,,按照解決問題的步驟編程【根據(jù)業(yè)務(wù)邏輯從上到下編程】

函數(shù)式:將某功能代碼封裝到函數(shù)中,,下次使用直接調(diào)用,無需重復(fù)編寫

面向?qū)ο缶幊蹋簩?shù)據(jù)與函數(shù)綁在一起封裝,,這樣能夠更快速的開發(fā)程序,,減少重復(fù)代碼的重寫過程 oop(object oriented programming),是一種解決軟件復(fù)用的設(shè)計(jì)和編程方法,,這種方法將軟件系統(tǒng)中相近相似的操作邏輯和操作應(yīng)用數(shù)據(jù),、狀態(tài),以的形式描述出來,,以對(duì)象實(shí)例的形式在軟件系統(tǒng)中復(fù)用,,以達(dá)到提高軟件開發(fā)效率的作用

面向過程適合做小項(xiàng)目,面向?qū)ο筮m合做大項(xiàng)目

2,、類和對(duì)象

2.1 概念

類:一個(gè)模板,,模板里包含多個(gè)函數(shù),函數(shù)中實(shí)現(xiàn)一些功能(汽車圖紙,、車類)

是一組具有相同或相似屬性和行為的多個(gè)對(duì)象的組合

對(duì)象:類的實(shí)例化,,可以執(zhí)行類中的函數(shù)(寶馬)

2.2 定義類和創(chuàng)建對(duì)象

定義類:類結(jié)構(gòu)=類名(首字母大寫)+屬性+方法行為

實(shí)例方法:在類內(nèi)部,,用def可以定義實(shí)例方法,,與一般函數(shù)不同的是實(shí)例方法必須包含參數(shù),默認(rèn)第一個(gè)參數(shù)是self(名字標(biāo)識(shí)可以是其他名字,但這個(gè)位置必須被占用)

  1. # class 類名:
  2. # 屬性
  3. # 方法
  4. class Person:#類名:首字母大寫
  5. #屬性
  6. name='小明'#類屬性
  7. age=20
  8. #方法(行為) 實(shí)例方法
  9. def eat(parms):
  10. parms.name='小紅'#實(shí)例屬性
  11. print('eating')
  12. pass
  13. def run(self):
  14. print('running')
  15. pass
  16. pass

創(chuàng)建對(duì)象

格式:對(duì)象名=類名()

  1. #創(chuàng)建對(duì)象[類的實(shí)例化]
  2. xm=Person()
  3. #調(diào)用函數(shù)
  4. xm.eat()
  5. print('{}的年齡是:{}歲'.format(xm.name,xm.age))

屬性

  • 類屬性:類對(duì)象所擁有的屬性(定義在類內(nèi)部,,實(shí)例方法外)
  • 實(shí)例屬性:實(shí)例對(duì)象擁有的屬性,,只能通過實(shí)例對(duì)象訪問(實(shí)例方法內(nèi)定義的【通過類似于self.變量名】變量)
  1. class Student:
  2. name='李明'#類屬性
  3. def __init__(self,age):
  4. self.age=age#實(shí)例屬性
  5. pass
  6. pass
  7. lm=Student(18)
  8. print(Student.name)
  9. print(lm.name)#類屬性可以被類對(duì)象和實(shí)例對(duì)象訪問
  10. print(lm.age)#實(shí)例屬性只能通過實(shí)例對(duì)象訪問
  11. print('不能通過類對(duì)象訪問實(shí)例屬性')
  12. print(Student.age)
  13. # 李明
  14. # 李明
  15. # 18
  16. # 不能通過類對(duì)象訪問實(shí)例屬性
  17. # Traceback (most recent call last):
  18. # File "E:\資源下載\workspace\shixun\pythonProject2\2.17多態(tài).py", line 47, in <module>
  19. # print(Student.age)
  20. # AttributeError: type object 'Student' has no attribute 'age'

類屬性和實(shí)例屬性的訪問原理:

2.3  __init__(self):

Python自帶的內(nèi)置函數(shù)

是一個(gè)初始化方法,用來定義實(shí)例屬性和初始化數(shù)據(jù),,在創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用

  1. class Person:
  2. def __init__(self):
  3. self.name='小倩'
  4. self.age=20
  5. def run(self):
  6. print('running')
  7. pass
  8. pass
  9. xq=Person()#創(chuàng)建新對(duì)象時(shí),,__init__自動(dòng)調(diào)用
  10. print(xq.name)
  11. #小倩

傳遞參數(shù)(后面實(shí)例方法都可以直接使用該參數(shù))

  1. class Person:
  2. def __init__(self,name,age):
  3. self.name=name
  4. self.age=age
  5. def eat(self,food):
  6. print(self.name+'喜歡吃'+food)
  7. xm=Person('小明',21)
  8. xm.eat('蘋果')

2.4 self的理解

self和對(duì)象指向同一內(nèi)存地址,self是對(duì)象的引用,,可以理解為對(duì)象自己

  1. class Person:
  2. def eat(self):
  3. print('self=%s',id(self))
  4. pass
  5. pass
  6. xm=Person()
  7. xm.eat()
  8. print('xm=%s',id(xm))
  9. #self=%s 1760559500112
  10. #xm=%s 1760559500112
  • self只有在類中定義實(shí)例方法時(shí)才有意義,,在調(diào)用時(shí)不必傳入相應(yīng)參數(shù),而是由解釋權(quán)自動(dòng)指向
  • self的名稱可以更改,,只是約定俗成的定義成了self
  • self指的是類實(shí)例對(duì)象本身

self傳參:

  1. class Person:
  2. def __init__(self,pro):
  3. self.pro=pro
  4. def eat(self,name,food,pro):
  5. print('%s喜歡吃%s,,修的專業(yè)是%s,%s'%(name,food,self.pro,pro))
  6. pass
  7. pass
  8. xm=Person('通信工程')
  9. xm.eat('小明','榴蓮','hhh')
  10. # 小明喜歡吃榴蓮,修的專業(yè)是通信工程,hhh

3,、魔術(shù)方法

定義:Python中的一些內(nèi)置好的特定方法,,方法名為“__xxx__”,前后有兩個(gè)下劃線

  • 在進(jìn)行特定操作時(shí),,魔術(shù)方法會(huì)自動(dòng)調(diào)用

常見的魔術(shù)方法:

3.1__str__()

定義了__str__方法,,在打印對(duì)象時(shí),會(huì)執(zhí)行__str__方法(__str__只能return一個(gè)字符串)

  1. class Animal:
  2. def __init__(self,name,colour):
  3. self.name=name
  4. self.colour=colour
  5. def __str__(self):
  6. return '我的名字是%s,,我的顏色是%s'%(self.name,self.colour)
  7. dog=Animal('旺財(cái)','白色')
  8. print(dog)
  9. #我的名字是旺財(cái),,我的顏色是白色
  10. #改變打印對(duì)象的內(nèi)容
  11. class Animal:
  12. def __init__(self,name,colour):
  13. self.name=name
  14. self.colour=colour
  15. dog=Animal('旺財(cái)','白色')
  16. print(dog)
  17. # <__main__.Animal object at 0x000001E49FEF6FD0>
  18. #直接輸出對(duì)象的地址

3.2 __new__()

調(diào)用對(duì)象實(shí)例的方法,每調(diào)用一次生成一個(gè)新對(duì)象,,cls是class的縮寫

  1. class Animal(object):
  2. def __init__(self,name,colour):
  3. self.name=name
  4. self.colour=colour
  5. print('__init__函數(shù)執(zhí)行')
  6. def __str__(self):
  7. return '我的名字是%s,,我的顏色是%s'%(self.name,self.colour)
  8. def __new__(cls, *args, **kwargs):
  9. print('__new__函數(shù)執(zhí)行')
  10. # return object.__new__(cls)#這里真正創(chuàng)建對(duì)象實(shí)例
  11. dog=Animal('旺財(cái)','白色')
  12. print(dog)
  13. #__new__函數(shù)執(zhí)行
  14. #None
  15. #解釋:還沒有生成對(duì)象實(shí)例
  1. class Animal(object):
  2. def __init__(self,name,colour):
  3. self.name=name
  4. self.colour=colour
  5. print('__init__函數(shù)執(zhí)行')
  6. def __str__(self):
  7. return '我的名字是%s,我的顏色是%s'%(self.name,self.colour)
  8. def __new__(cls, *args, **kwargs):
  9. print('__new__函數(shù)執(zhí)行')
  10. return object.__new__(cls)#這里真正創(chuàng)建對(duì)象實(shí)例
  11. # return super().__new__(cls)#若沒有父類object,用super()創(chuàng)建對(duì)象實(shí)例
  12. dog=Animal('旺財(cái)','白色')
  13. print(dog)
  14. # __new__函數(shù)執(zhí)行
  15. # __init__函數(shù)執(zhí)行
  16. # 我的名字是旺財(cái),,我的顏色是白色
  17. #先執(zhí)行__new__(),,創(chuàng)建對(duì)象實(shí)例后執(zhí)行__init__
  18. #__new__()創(chuàng)建實(shí)例框架,__init__豐滿

__new__方法在__init__方法前執(zhí)行

__new__方法不能調(diào)用自己的__new__方法,,即:return cls.__new__(cls)

  • 否則會(huì)報(bào)錯(cuò):RecursionError:maximum recursion depth exceeded超過最大遞歸深度

__new__和__init__的區(qū)別

  • __new__:類的實(shí)例化方法,,必須返回該實(shí)例,不然對(duì)象創(chuàng)建不成功
  • __init__:做對(duì)象的初始化工作,,也可以認(rèn)為是實(shí)例的構(gòu)造方法,,接受該實(shí)例self并對(duì)其構(gòu)造
  • __new__至少一個(gè)參數(shù)是cls,代表要實(shí)例化的類,,該參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)提供
  • __new__要早于__init__函數(shù)執(zhí)行

課后問答

4,、析構(gòu)方法

當(dāng)一個(gè)對(duì)象被刪除或銷毀時(shí),Python解釋器默認(rèn)調(diào)用__del__()方法,,這個(gè)方法也稱析構(gòu)方法,,也是一種魔術(shù)方法

  • 用于對(duì)象的釋放,,對(duì)象一旦被釋放,不能再使用

程序執(zhí)行結(jié)束自動(dòng)調(diào)用__del__()

  1. class Animal:
  2. def __init__(self,name):
  3. self.name=name
  4. print('__init__執(zhí)行')
  5. def __del__(self):
  6. print('__del__執(zhí)行')
  7. pass
  8. cat=Animal('cat')
  9. print('程序等待中,。,。。')
  10. # __init__執(zhí)行
  11. # 程序等待中,。,。。
  12. # __del__執(zhí)行

對(duì)象被刪除時(shí),,也會(huì)自動(dòng)調(diào)用__del__方法

  1. class Animal:
  2. def __init__(self,name):
  3. self.name=name
  4. print('__init__執(zhí)行')
  5. def __del__(self):
  6. print('__del__執(zhí)行')
  7. pass
  8. cat=Animal('cat')
  9. del cat#手動(dòng)去清理對(duì)象
  10. print('*'*20)
  11. # __init__執(zhí)行
  12. # __del__執(zhí)行
  13. # ********************

5,、類的繼承*

Python面向?qū)ο蟮娜筇卣鳎悍庋b、繼承,、多態(tài)

封裝:把內(nèi)容封裝到某個(gè)地方,,便于后面的使用【其實(shí)就是使用初始化構(gòu)造方法將內(nèi)容封裝到對(duì)象中,然后通過對(duì)象直接或者self來獲取封裝的內(nèi)容】

繼承:即子可以繼承父的內(nèi)容(屬性和行為)

  • 將多個(gè)類共有的方法提取到【父類】中,,然后通過繼承,,極大提高了效率,減少代碼的重復(fù)編寫

5.1 單繼承

  1. class Animal:
  2. def eat(self):
  3. print('eating')
  4. class Cat(Animal):
  5. pass
  6. cat1=Cat()
  7. cat1.eat()
  8. #eating

5.2 多繼承

子類繼承多個(gè)父類,,用逗號(hào)分隔  class C(A,B)

問題是:當(dāng)多個(gè)父類中存在相同方法時(shí),,應(yīng)該調(diào)用哪一個(gè)呢?

  1. class E:
  2. def eat(self):
  3. print('E.eat')
  4. class D:
  5. def eat(self):
  6. print('D.eat')
  7. class C(E):
  8. # def eat(self):
  9. # print('C.eat')
  10. pass
  11. class B(D):
  12. pass
  13. class A(B,C):
  14. pass
  15. a1=A()
  16. a1.eat()#查找順序,,A中沒有,,找B,B中沒有,,找C
  17. print(A.__mro__)
  18. # D.eat
  19. # (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)

__mro__方法:查詢執(zhí)行順序

繼承的傳遞性:爸爸繼承了爺爺,,兒子繼承爸爸,也繼承了爺爺

5.3 重寫和調(diào)用父類方法

子類中有個(gè)跟父類方法名稱一樣的方法,,相當(dāng)于重寫父類方法(方法覆蓋)

重寫父類方法后,,子類調(diào)用父類方法時(shí),調(diào)用的是子類的方法

  1. class Father:
  2. def eat(self):
  3. print('爸爸')
  4. pass
  5. class Son(Father):
  6. def eat(self):
  7. print('兒子')
  8. pass
  9. son=Son()
  10. son.eat()
  11. print(Son.__mro__)
  12. # 兒子
  13. # (<class '__main__.Son'>, <class '__main__.Father'>, <class 'object'>)

調(diào)用父類方法

  1. class Dog:
  2. def __init__(self,name,color):
  3. self.name=name
  4. self.color=color
  5. def bark(self):
  6. print('汪汪汪,。,。')
  7. class Keji(Dog):
  8. def __init__(self,name,color,age):#重寫父類方法
  9. # Dog.__init__(self,name,color)#調(diào)用父類方法1--手動(dòng)調(diào)用
  10. super().__init__(name,color)#調(diào)用父類方法2--自動(dòng)調(diào)用:super()自動(dòng)查找父類方,進(jìn)而調(diào)用方法
  11. self.age=age
  12. def dark(self):
  13. print('啊啊啊,。,。')
  14. super().bark()#調(diào)用父類方法
  15. print('啊啊啊。,。')
  16. def msg(self):
  17. print('名字:%s,,顏色:%s,年齡:%s'%(self.name,self.color,self.age))
  18. keji=Keji('柯基','黃白',2)
  19. keji.dark()
  20. keji.msg()
  21. # 啊啊啊,。,。
  22. # 汪汪汪,。。
  23. # 啊啊啊,。。
  24. # 名字:柯基,,顏色:黃白,,年齡:2

super():假如繼承了多個(gè)父類,則會(huì)按順序查找

  1. class Animal:
  2. def bark(self):
  3. print('動(dòng)物叫,。,。')
  4. class Keji(Animal,Dog):
  5. def __init__(self,name,color,age):#重寫父類方法
  6. # Dog.__init__(self,name,color)#調(diào)用父類方法1
  7. super().__init__(name,color)#調(diào)用父類方法2:super()自動(dòng)查找父類方,進(jìn)而調(diào)用方法
  8. self.age=age
  9. def dark(self):
  10. print('啊啊啊,。,。')
  11. super().bark()#調(diào)用父類方法
  12. print('啊啊啊。,。')
  13. def msg(self):
  14. print('名字:%s,,顏色:%s,年齡:%s'%(self.name,self.color,self.age))
  15. keji=Keji('柯基','黃白',2)
  16. keji.dark()
  17. keji.msg()
  18. # 啊啊啊,。,。
  19. # 動(dòng)物叫。,。
  20. # 啊啊啊,。。
  21. # 名字:柯基,,顏色:黃白,,年齡:2

6、多態(tài)

定義:就是多種狀態(tài)(形態(tài)),,就是同一種行為,,對(duì)于不同子類【對(duì)象】有不同的行為表現(xiàn)

想實(shí)現(xiàn)多態(tài)必須滿足的兩個(gè)條件:

  1. 繼承:多態(tài)必須發(fā)生在父態(tài)和子態(tài)之間
  2. 重寫:子類重寫父類方法

作用:增加程序的靈活性和擴(kuò)展性

鴨子類型:在程序設(shè)計(jì)中,鴨子類型是動(dòng)態(tài)類型的一種風(fēng)格,?!傍喿訙y(cè)試”可以表述為:“當(dāng)一個(gè)鳥走起來像鴨子,叫起來像鴨子,,那么這只鳥可以稱為鴨子”

  1. class Animal:
  2. def say(self):
  3. print("動(dòng)物叫")
  4. pass
  5. class Dog(Animal):
  6. def say(self):
  7. print('汪汪汪')
  8. pass
  9. class Cat(Animal):
  10. def say(self):
  11. print('喵喵喵')
  12. pass
  13. # dog=Dog()
  14. # dog.say()
  15. # cat=Cat()
  16. # cat.say()
  17. def common(obj):
  18. obj.say()
  19. i=[Dog(),Cat()]
  20. for item in i:
  21. common(item)
  22. # 汪汪汪
  23. # 喵喵喵

7,、類方法和靜態(tài)方法

類方法:類對(duì)象所擁有的方法,用裝飾器@classmate標(biāo)識(shí),,類方法的第一個(gè)參數(shù)必須是類對(duì)象,,一般以cls作為第一個(gè)參數(shù)。

可以通過類對(duì)象,、實(shí)例對(duì)象調(diào)用

  1. class Student:
  2. name='李華'#類屬性
  3. @classmethod
  4. def get_name(cls):
  5. return cls.name#訪問類屬性
  6. @classmethod
  7. def change_name(cls,new_name):
  8. cls.name=new_name#在類方法中修改類屬性的值
  9. print(Student.get_name())#類對(duì)象引用
  10. lh=Student()
  11. print(lh.get_name())#實(shí)例對(duì)象引用
  12. # 李華
  13. # 李華
  14. Student.change_name("小花")
  15. print(Student.get_name())#類對(duì)象引用
  16. xh=Student()
  17. print(xh.get_name())#實(shí)例對(duì)象引用
  18. # 小花
  19. # 小花

靜態(tài)方法:類對(duì)象所擁有的方法,,需要用@staticmethod來表示靜態(tài)方法

  1. class Student:
  2. name='李華'#類屬性
  3. @staticmethod
  4. def getdate():
  5. return Student.name
  6. print(Student.getdate())#類對(duì)象引用
  7. lh=Student()
  8. print(lh.getdate())#實(shí)例對(duì)象引用
  9. # 李華
  10. # 李華

靜態(tài)方法一般不會(huì)通過實(shí)例對(duì)象訪問

為什么使用靜態(tài)方法,?

靜態(tài)方法主要用來存放邏輯性代碼,在靜態(tài)方法中,,不會(huì)涉及到類中方法和屬性的操作,,數(shù)據(jù)資源能得到有效利用

  1. #引入第三方時(shí)間模塊
  2. import time
  3. class Timetest:
  4. @staticmethod
  5. def showtime():
  6. return time.strftime("%H:%M:%S",time.localtime())
  7. pass
  8. print(Timetest.showtime())
  9. # 15:46:56
  • 類方法的第一個(gè)參數(shù)是類對(duì)象cls,進(jìn)而去引用類對(duì)象的屬性和方法
  • 實(shí)例方法的第一個(gè)參數(shù)必須是self,,通過self去引用類屬性或?qū)嵗龑傩?,若存在相同名稱實(shí)例屬性和類屬性,實(shí)例屬性優(yōu)先級(jí)最高
  • 靜態(tài)方法不需要定義額外參數(shù),,需要引用屬性時(shí),,可通過類對(duì)象或?qū)嵗龑?duì)象去引用

8、私有化屬性和方法--保護(hù)和控制數(shù)據(jù)

8.1私有化屬性

保護(hù)屬性安全,,不得隨意修改,,將屬性定義成私有化屬性,添加可調(diào)用的方法去訪問

使用私有化屬性的場(chǎng)景:

  1. 把特定屬性隱藏,,不想讓類的外部直接調(diào)用(不能在外部直接訪問,,在類的內(nèi)部可以隨意訪問)
  2. 保護(hù)這個(gè)屬性,不想讓該屬性的值隨意改變(內(nèi)部可以修改)
  3. 保護(hù)屬性,,不想讓派生類【子類】去繼承(子類不能繼承父類的私有屬性)

語法:兩個(gè)下劃線開頭,,聲明屬性為私有屬性,不能在類的外部被使用或直接訪問

  1. class Person:
  2. def __init__(self):
  3. self.name='李四'
  4. self.__age=18#屬性私有化(外部不能訪問,,內(nèi)部可以訪問)
  5. pass
  6. def __str__(self):
  7. return('{}的年齡是{}'.format(self.name,self.__age))
  8. x1=Person()
  9. print(x1)
  10. print(x1.name)
  11. print(x1.__age)#通過類對(duì)象在外部訪問(私有化后,,不能在外部直接訪問)
  12. # Traceback (most recent call last):
  13. # File "E:\資源下載\workspace\shixun\pythonProject2\2.17多態(tài).py", line 125, in <module>
  14. # print(x1.__age)#通過類對(duì)象在外部訪問(私有化后,不能在外部直接訪問)
  15. # AttributeError: 'Person' object has no attribute '__age'
  16. # 李四的年齡是18
  17. # 李四

 8.2 私有化方法

語法:方法名前加兩個(gè)下劃線

  • 私有化的方法不能被【子類】繼承
  • 外部不能直接調(diào)用,,內(nèi)部可以調(diào)用

__xxx:方法私有化

__xxx__:魔術(shù)方法,,Python自有,開發(fā)者不要?jiǎng)?chuàng)建

xxx_:避免屬性名與Python關(guān)鍵字沖突

9,、property屬性函數(shù)

讓調(diào)用者能直接以訪問屬性的方式,,而且又能控制的方式

實(shí)現(xiàn)方法1-- 類屬性

  1. class Animal(object):
  2. def __init__(self):
  3. self.__age=18#私有化屬性
  4. def dog(self):#訪問私有屬性
  5. return self.__age
  6. def chance(self,age):#修改私有實(shí)例屬性
  7. if age<0:
  8. print('年齡不能小于0')
  9. pass
  10. else:
  11. self.__age=age
  12. #定義一個(gè)類屬性,實(shí)現(xiàn)直接訪問屬性的形式去訪問私有的屬性
  13. age=property(dog,chance)
  14. a1=Animal()
  15. print(a1.age)#訪問私有屬性
  16. #18
  17. a1.age=2#修改私有屬性
  18. print(a1.age)
  19. #2

實(shí)現(xiàn)方法2:裝飾器*

即在方法上使用裝飾器

  1. class Animal(object):
  2. def __init__(self):
  3. self.__age=18#私有化屬性
  4. @property#通過裝飾器修飾添加屬性標(biāo)志,,提供一個(gè)getter方法
  5. def dog(self):#訪問私有屬性
  6. return self.__age
  7. @dog.setter#提供一個(gè)setter方法
  8. def chance(self,parms):#修改私有實(shí)例屬性
  9. if parms<0:
  10. print('年齡不能小于0')
  11. pass
  12. else:
  13. self.__age=parms
  14. pass
  15. a1=Animal()
  16. print(a1.dog)#訪問私有屬性
  17. #18
  18. a1.chance=2#修改私有屬性
  19. print(a1.dog)
  20. #2

10,、__new__方法(參考3.2)和單例模式

單例模式:一種常用的軟件設(shè)計(jì)模式

目的:確保某個(gè)類中只有一個(gè)實(shí)例存在

實(shí)現(xiàn)步驟:利用類屬性保存初次創(chuàng)建的實(shí)例對(duì)象,第二次實(shí)例化對(duì)象的時(shí)候判斷類屬性是否保存實(shí)例對(duì)象,,如果有就返回類屬性保存的,,如果沒有就調(diào)用父類__new__方法創(chuàng)建新的實(shí)例對(duì)象

  1. class Student(object):
  2. __instance=None
  3. def __init__(self,name,age):
  4. self.name=name
  5. self.age=age
  6. pass
  7. def __new__(cls, *args, **kwargs):
  8. if not cls.__instance:
  9. cls.__instance=super(Student,cls).__new__(cls)#沒有保存實(shí)例,就保存
  10. return cls.__instance
  11. else:
  12. return cls.__instance
  13. pass
  14. pass
  15. xm=Student('LH',19)
  16. print(id(xm))
  17. xh=Student('XH',20)
  18. print(id(xh))
  19. # 2390515351312
  20. # 2390515351312
  21. #id相同,,說明實(shí)例化兩次對(duì)象,,都是同一對(duì)象

 11、異常處理

語法格式:

  1. try:
  2. 可能出現(xiàn)錯(cuò)誤的代碼塊
  3. except:
  4. 出錯(cuò)后執(zhí)行的代碼塊
  5. else:
  6. 沒有錯(cuò)誤執(zhí)行的代碼塊
  7. finally:
  8. 不管有沒有出錯(cuò)都要執(zhí)行的代碼塊
  1. try:
  2. x=x/2
  3. print(x)
  4. except NameError as msg:
  5. print(msg)
  6. #name 'x' is not defined

 Python內(nèi)置異常類型:

Exception:萬能類型,、可以捕獲所有異常

自定義異常

  • 要直接或間接繼承Error或Exception
  • 用raise關(guān)鍵字拋出異常
  1. class Toolong(Exception):
  2. def __init__(self,leng):
  3. self.leng=leng
  4. pass
  5. def __str__(self):
  6. return '你的長度為%s,過長了,。,。'%self.leng
  7. pass
  8. def name_test():
  9. name=input('請(qǐng)輸入你的名字:')
  10. try:
  11. if len(name)>4:
  12. raise Toolong(len(name))
  13. else:
  14. print(name)
  15. pass
  16. pass
  17. except Toolong as msg:
  18. print(msg)
  19. finally:
  20. print('執(zhí)行完畢')
  21. name_test()
  22. # 請(qǐng)輸入你的名字:chenq
  23. # 你的長度為5,過長了。,。
  24. # 執(zhí)行完畢

12,、動(dòng)態(tài)添加屬性和方法

動(dòng)態(tài)語言能在運(yùn)行時(shí)改變其結(jié)構(gòu);Python,、php,、JavaScript是動(dòng)態(tài)語言,c,、c#、Java是靜態(tài)語言

所有,,Python在程序運(yùn)行過程中添加屬性和方法

12.1 動(dòng)態(tài)添加屬性

  1. #動(dòng)態(tài)添加屬性
  2. class Animal:
  3. def __init__(self,name,age):
  4. self.name=name
  5. self.age=age
  6. def say(self):
  7. print('%s 年齡:%s'%(self.name,self.age))
  8. pass
  9. cat=Animal('小貓',2)
  10. cat.say()
  11. cat.color='花色'#給對(duì)象動(dòng)態(tài)添加屬性
  12. print(cat.color)
  13. Animal.color='白色'#給類動(dòng)態(tài)添加屬性
  14. print(Animal.color)
  15. #小貓 年齡:2
  16. #花色
  17. #白色

12.2動(dòng)態(tài)添加方法(需要用到types模塊)

語法:

  1. import types#引入代碼塊
  2. def 方法名(self):
  3. xxx
  4. pass
  5. class 類名:
  6. xxx
  7. pass
  8. 實(shí)例名=類名()
  9. 實(shí)例名.引入方法的新名字=types.MethodType(方法名,實(shí)例名)#動(dòng)態(tài)添加方法
  10. 實(shí)例名.引入方法的新名字()#調(diào)用新方法
  1. import types#引入types模塊
  2. def run(self):
  3. print("%s 歲的%s在跑,。。"%(self.age,self.name))
  4. class Animal:
  5. def __init__(self,name,age):
  6. self.name=name
  7. self.age=age
  8. pass
  9. cat=Animal('小貓',2)
  10. cat.run=types.MethodType(run,cat)#動(dòng)態(tài)添加方法
  11. cat.run()#調(diào)用方法
  12. #2 歲的小貓?jiān)谂??!?/div>

12.3 動(dòng)態(tài)綁定類方法和靜態(tài)方法

語法:類名.新名字=類方法名

  1. @classmethod
  2. def classTest(cls):
  3. print('這是個(gè)類方法')
  4. pass
  5. @staticmethod
  6. def staticTest():
  7. print("這是個(gè)靜態(tài)方法")
  8. pass
  9. class Animal():
  10. pass
  11. #動(dòng)態(tài)給類添加類方法、靜態(tài)方法
  12. Animal.classnewname=classTest
  13. Animal.staticnewname=staticTest
  14. #調(diào)用類方法,,靜態(tài)方法
  15. Animal.classnewname()
  16. Animal.staticnewname()

13,、__slots__屬性

作用:限制可以添加的實(shí)例屬性

  1. class Animal(object):
  2. __slots__ = ('name','age','weight')#限制添加的屬性
  3. def __str__(self):
  4. return '%s 。,。,。%s'%(self.name,self.age)
  5. pass
  6. xh=Animal()
  7. xh.name='小花'
  8. xh.age=20
  9. xh.weight=45
  10. # xh.height 被限制,運(yùn)行會(huì)報(bào)錯(cuò)
  11. print(xh)#小花 ,。,。。20

__dict__:所有可用的屬性都存儲(chǔ)在這,,占用內(nèi)存高,;使用__slots__后,實(shí)例中不再有__dict__

  1. class Animal(object):
  2. # __slots__ = ('name','age','weight')#限制添加的屬性
  3. def __str__(self):
  4. return '%s ,。,。。%s'%(self.name,self.age)
  5. pass
  6. xh=Animal()
  7. xh.name='小花'
  8. xh.age=20
  9. xh.weight=45
  10. # xh.height 被限制,,運(yùn)行會(huì)報(bào)錯(cuò)
  11. print(xh)#小花 ,。。,。20
  12. print(xh.__dict__)#沒有設(shè)置__slots__時(shí),,所有可用的屬性存儲(chǔ)在這
  13. # 小花 。,。,。20
  14. # {'name': '小花', 'age': 20, 'weight': 45}

slots的作用:限制實(shí)例的屬性,;節(jié)約內(nèi)存空間

子類繼承父類時(shí),若不聲明slots,,不繼承父類的slots,;聲明slots后,子類限制屬性=父類+自身

  1. class Animal(object):
  2. __slots__ = ('name','age','weight')#限制添加的屬性
  3. def __str__(self):
  4. return '%s ,。,。。%s'%(self.name,self.age)
  5. pass
  6. class Dog(Animal):
  7. __slots__ = ('color')#未聲明時(shí),,不繼承父類__slots__,,聲明后,限制屬性=父類+自身
  8. pass
  9. dog=Dog()
  10. dog.color='白色'
  11. print(dog.color)
  12. # 白色
文章已被收錄至官方知識(shí)檔案

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多