日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python】学习笔记总结2(Python面向对象)

發布時間:2024/9/30 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】学习笔记总结2(Python面向对象) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 二、Python面向對象
    • 1.類(Class)
      • 1.1.定義類
      • 1.2.類屬性
      • 1.3.實例屬性
        • 1.3.1.內部添加
        • 1.3.2.外部添加
      • 1.4.實例方法
      • 1.5.類方法
      • 1.6.靜態方法
      • 1.7.__init__方法(初始化)
      • 1.8.Self(當前對象的引用)
      • 1.9.魔術方法
        • 1.9.1.魔術方法介紹大全
    • 2.方法、繼承、多態
      • 2.1.析構方法`__del__ `
        • 2.1.1.釋放對象時調用
        • 2.1.2.手動清空對象
      • 2.2.繼承
        • 2.2.1.單繼承
        • 2.2.2.多繼承
        • 2.2.3.重寫父類方法
        • 2.2.4.重寫`__init__`方法
        • 2.2.4多態
      • 2.3類屬性和實例屬性區別
      • 2.4類方法和實例方法和靜態方法
    • 3.封裝與單例
      • 3.1.封裝
      • 3.2.單例模式
      • 3.3.異常處理
        • 3.3.1.異常類型
        • 3.3.2.自定義異常類型
      • 3.4.動態添加屬性和方法

二、Python面向對象

1.類(Class)

1.1.定義類

class Person :name = '小明'#類屬性age = '20'#類屬性def eat(self):print('吃飯')passpass
  • 使用
xiaoming = Person()

1.2.類屬性

在類的內部,使用def關鍵字定義且有類似(self)的,使用權歸實例所有

name = '小明'#類屬性

1.3.實例屬性

1.3.1.內部添加

在方法的內部,使用self引用的屬性

def __init__(self):self.friend = '小紅'

1.3.2.外部添加

class People :def eat(self):print(self)passpassxiaoming = People() xiaoming.name = '小明' xiaoming.age = 20 print(xiaoming.name)

1.4.實例方法

在類的內部,使用def關鍵字定義且有類似(self)的,使用權歸實例所有

def eat(self):print('吃飯')passpass

1.5.類方法

類對象所擁有的方法,用裝飾器@classmethod來標
識其為類方法,對于類方法,第一個參數必須是類對象,
一般以cls作為第- -個參數,
類方法可以通過類對象,實例對象調用

類方法可以訪問、修改類屬性

name = '小明'@classmethoddef findNameInfo(cls):return cls.namepass

1.6.靜態方法

靜態方法不需要傳參例如(cls/self)
靜態方法不可以訪問類屬性
通常用類直接訪問靜態方法,本身和類與實例無關

import time class Test :def __init__(self,hour,min,second):self.hour = hourself.min = minself.second = second@staticmethoddef showTime():return time.strftime("%H:%M:%S" ,time.localtime())pass passprint(Test(1,2,3).showTime())

1.7.__init__方法(初始化)

*類似于構造函數,對self的屬性進行構造
自動執行的初始化方法,自帶的內置函數

class People :def __init__(self,name,age):self.name = nameself.age = agepassdef showInfo(self):print(self.name+'年齡'+self.age)passpassxiaoming = People('小明',20)

1.8.Self(當前對象的引用)

實例化后,python解釋器會把當前對象自動傳遞給self

1.9.魔術方法

  • __str__
    打印時調用的方法
class People :def __init__(self,name,age):self.name = nameself.age = agepassdef __str__(self):return '姓名:%s 年齡:%d'%(self.name,self.age)passpassxiaoming = People('小明',20) print(xiaoming)
  • __new__
    創建對象實例的方法,調用一次就會生成新的對象cls(class)cls自動提供
    真正創建實例的方法,經常單例模式使用,必須返回實例
class People :def __init__(self,name,age):self.name = nameself.age = ageprint('__init__')passdef __new__(cls, *args, **kwargs):print('__new__')return object.__new__(cls)passpassxiaoming = People('小明',20)
  • 區別__new __和__init__
  • __new __類的實例化方法必須要返回該實例否則對象就創建不成功
  • __init__用來做數據屬性的初始化工作也可以認為是實例的構造方法接受類的實例self并對其進行構造
  • __new __至少有一個參數是cls代表要實例化的類,此參數在實例化時由python解釋器自動提供
  • __new __函數執行要是于__init__函數

1.9.1.魔術方法介紹大全

魔術方法介紹大全

2.方法、繼承、多態

2.1.析構方法__del__

當一個對象被刪除或者被銷毀時,python解釋器也會默認調用一個方法,這個方法為__del__ ()方
法,也稱為析構方法

2.1.1.釋放對象時調用

class People :def __init__(self,name,hp):self.name = nameself.hp = hppassdef __del__(self):print('銷毀了')passpassxiaohong = People('xiaohong',100)

2.1.2.手動清空對象

del xiaohong

2.2.繼承

2.2.1.單繼承

class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def wwj(self):print('汪汪叫')passpass

2.2.2.多繼承

class Animal :def eat(self):print('吃')passpassclass God:def fly(self):print('飛')passpassclass Wukong(Animal,God):def Dayaoguai(self):print('打妖怪')passpass
  • 多繼承,同名方法查找父類,如沒有則向父類的父類查找(廣度優先)
  • __mro__方法解析順序,用來了解繼承順序

2.2.3.重寫父類方法

class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpass

2.2.4.重寫__init__方法

class People :def __init__(self,name,hp):self.name = nameself.hp = hpprint('調用People__init__')passpassclass Man(People):def __init__(self,name,hp):People.__init__(self,name,hp)#調用父類方法1#super().__init__(name,hp)#調用父類方法2,可在父類逐個查找print('調用Man__init__')passpassman = Man('xxx',100)

2.2.4多態

繼承并擴展父類代碼,不需要修改父類代碼

class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpassclass Cat(Animal) :def eat(self):print('小口吃')passpassdef commonInvoke(obj) :obj.eat()listObj = [Animal(),Cat(),Dog()]for item in listObj :commonInvoke(item)

2.3類屬性和實例屬性區別


實例對象不可以修改類屬性,類屬性所有權歸類所有

2.4類方法和實例方法和靜態方法

1.類方法的第一個參數是類對象cls,通過cls引用的類對象的屬性和方法
2.實例方法的第一個參數是實例對象self,通過self引用的可能是類屬性、也有可能是實例屬
性(這個需要具防分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先
級更高。
3.靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引
用。

3.封裝與單例

3.1.封裝

  • 屬性私有化,無法外部訪問,不能被繼承,只能內部類使用
class Person :__age = 20 #類屬性私有化def __init__(self):self.__name = '小明'#實例屬性私有化passpass
  • 方法私有化,無法外部訪問,不能被繼承,只能內部類使用
class Person :def __run(self): #實例方法私有化print('跑')passpass
  • 下劃線類型
下劃線說明
_xxxprotected類型(只允許本身和子類訪問)
__xxxprivate類型(只允許本身訪問)
__xxx__魔術方法,Python內置方法
xxx_避免屬性名與python關鍵字沖突
  • property(屬性函數)

  • 類屬性的方式實現

class Person :def __init__(self):self.__name = '小明'passdef get_name(self):return self.__namedef set_name(self,name):if name < 0:print('no')else :self.__name = namepassname = property(get_name, set_name) pass person = Person() print(person.name)#訪問類屬性name
  • 裝飾器方式實現
class Person :def __init__(self):self.__name = '小明'pass@property #添加裝飾器 添加屬性標志def name(self):return self.__name@name.setter #提供一個setter方法def name(self,name):if name == '小明':print('no')else :self.__name = namepass pass person = Person() person.name = '小紅' print(person.name)#訪問類屬性name
  • __new__實例化方法
class Person :def __init__(self):self.__name = '小明'passdef __new__(cls, *args, **kwargs):return super().__new__(cls, *args, **kwargs)passpass

3.2.單例模式

不能使用自身new方法,會產生深度遞歸

class Person :__instance = Nonedef __new__(cls, *args, **kwargs):if not hasattr(cls,'_instance') :cls.__instance = super().__new__(cls, *args, **kwargs)return cls.__instancepasspass

3.3.異常處理

try#可能出現錯誤的代碼塊 except:#出錯之后執行的代碼塊 else:#沒有出錯的代碼塊 finally:#不管出沒出錯都會執行的代碼塊

根據錯誤類型來捕獲的(NameError 、IndexError …)
自上而下依次判斷

try :print(b)li = [1,2,3,4]print(li[100]) except NameError as msg:print('出錯')print(msg) except IndexError as msg:print('出錯')print(msg) except Exception as msg:#所有異常print('出錯')print(msg)

3.3.1.異常類型

當前函數沒找到,則向上層一層層傳遞查找

異常導致的錯誤
AssertionError當assert語句失敗時引發。
AttributeError當 屬性分配或引用失敗時引發。
EOFError當input()函數達到文件結束條件時引發。
FloatingPointError當浮 點運算失敗時引發。
GeneratorExit調用 生成器的close()方法時引發。
ImportError找不到導入的模塊時引發。
IndexError當序 列的索引超出范圍時引發。
KeyError在字典中找不到鍵時引發。
KeyboardInterrupt當用戶 按下中斷鍵(Ctrl+c或delete)時引發。
MemoryError當操作耗盡內存時引發。
NameError在局部或全局范圍內找不到變量時引發。
NotImplementedError由抽象方法提出。
OSError當系統操作導致系統相關錯誤時引發。
Overf lowError當算術運算的結果太大而無法表示時引發。
ReferenceError使用弱引用代理訪問垃圾收集的引用時引發。
Runt imeError當錯誤不屬于任何其他類別時引發。
StopIteration函數引發,以指示迭代器不再返回任何項。
SyntaxError遇到語法錯誤時由解析器引發。
Indentat ionError當縮進不正確時引發。
TabError當縮進由不一致的制表符和空格組成時引發。
SystemError當解釋器檢測到內部錯誤時引發。
Sys temExit由sys. exit()函數引發。
TypeError將函數或操作應用于類型不正確的對象時引發。
UnboundLocalError當在函數或方法中引用局部變量,但沒有將值綁定到該變量時引發。
UnicodeError當 發生與unicode相關的編碼或解碼錯誤時引發。
UnicodeEncodeError當編碼過程中發生與unicode相關的錯誤時引發。
UnicodeDecodeError當解碼過程中出現與unicode相關的錯誤時引發。
UnicodeTrans lateError翻譯過程中發生與unicode相關的錯誤時引發。
ValueError當函數得到類型正確但值不正確的參數時引發。
ZeroDivisionError當除法或模運算的第二個操作數為零時引發。

3.3.2.自定義異常類型

class LenException(Exception):def __init__(self,leng):self.len = lengpassdef __str__(self):return '長度超了'passdef name_Test():try :name = '1111111111'if len(name)>5:raise LenException(len(name))else:print(name)passpassexcept LenException as msg:print(msg) passname_Test()

3.4.動態添加屬性和方法

  • 動態添加屬性
class Student :def __init__(self,name):self.name = namepassdef __str__(self):return '姓名:%s' %(self.name) student = Student('小明') student.age = 20 # 動態添加實例屬性 Student.age = 20 # 動態添加類屬性 print(student) print(student.age)
  • 動態添加實例方法
import types #添加方法的庫def runA(self):print(self.name)passclass Student :def __init__(self):self.name = '小明'passpass stu = Student() stu.run = types.MethodType(runA , stu)#動態添加實例方法 stu.run()#調用
  • 動態添加類方法
@classmethod def runA(self):print(self.name)passclass Student :name = '小明'pass Student.run = runA#動態添加實例方法 Student.run()#調用
  • 動態添加靜態方法
@staticmethod def runA():print('55555')passclass Student :name = '小明'pass Student.run = runA#動態添加實例方法 Student.run()#調用
  • __slots__屬性
    來限制該class能添加的屬性。
    子類不會繼承,只有在當前類中有效。
    子類聲明__slots__屬性才會繼承
  • 限制添加的屬性
class Student(object) :__slots__ = ('name','age') # 限制添加的屬性,避免存儲多余的數據def __str__(self):return '{},{}' .format(self.name,self.age)passpassstu = Student() stu.name = '1' stu.age = 20 stu.high = 20 # 添加不了報錯了 print(stu) print(stu.__dict__)#所有可以用的屬性都在這里,占空間大 print(stu.__slots__ )#存儲限制添加的屬性,避免存儲多余的數據
  • __call__屬性
class Student(object) :def __call__(self, *args, **kwargs):print('1111')passstu = Student() stu()

總結

以上是生活随笔為你收集整理的【Python】学习笔记总结2(Python面向对象)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。