1. 程式人生 > >python3 面向物件程式設計,錯誤以及異常處理

python3 面向物件程式設計,錯誤以及異常處理

類與例項

類是抽象的模板,例項是根據類創建出來的一個個具體的“物件”;

術語解釋

類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。 方法:類中定義的函式。 類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。 資料成員:類變數或者例項變數用於處理類及其例項物件的相關的資料。 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。 例項變數:定義在方法中的變數,只作用於當前例項的類。 繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基類物件對待。例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。 例項化:建立一個類的例項,類的具體物件。 物件:通過類定義的資料結構例項。物件包括兩個資料成員(類變數和例項變數)和方法

定義類

class Student(object):
    pass
#類通常是以大寫字母開頭,object表示該類是從那個類繼承下來的(如果最上面的類找不到繼承直接寫object即可)

類的初始化

(_ init )方法的第一個引數永遠是self,表示建立的例項本身,因此,在 init _方法內部,就可以把各種屬性繫結到self。

class Int:
    def __init__(self, a, b):  #self代表例項
        self.r = a
        self.i = b
x = Complex(3, 4)  #例項化物件是需要傳遞兩個引數
print(x.r, x.i) 
輸出結果:3 4

類物件

類物件支援兩種操作:屬性引用和例項化

#定義Student類:
class Student:
    id = 123
    def f(self):
        return 'hello world'

#例項化類
x = Student()

#訪問類的屬性和方法:
print("student的屬性:",x.id)
print("student的方法:",x.f())
輸出結果:
student的屬性: 123
student的方法: hello world

類的方法

在類地內部,使用def關鍵字可以為類定義一個方法,與一般函式定義不同,類方法必須包含引數self,且為第一個引數:

class Student:
    #定義基本屬性
    name = ''
    age = 0
    #設定訪問限制:定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))

# 例項化類
p = people('xiaoming',10,30)
p.speak()
輸出結果:
xiaoming 說: 我 10 歲。

類的繼承:單繼承和多繼承

class Student:
    name = ''
    age = 0
    __weight = 0
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))

#單繼承
class people(Student):
    grade = ''
    def __init__(self,n,a,w,g):
        #呼叫父類的構函
        Student.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))

#多重繼承準備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s"%(self.name,self.topic))

#多重繼承
class sample(speaker,people):
    a =''
    def __init__(self,n,a,w,g,t):
        people.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
print(test.speak())   #方法名同,預設呼叫的是在括號中排前地父類的方法
輸出結果:
我叫 Tim,我是一個演說家,我演講的主題是 Python

類的專有方法

__init__ : 建構函式,在生成物件時呼叫
__del__ : 解構函式,釋放物件時使用
__repr__ : 列印,轉換
__setitem__ : 按照索引賦值
__getitem__: 按照索引獲取值
__len__: 獲得長度
__cmp__: 比較運算
__call__: 函式呼叫
__add__: 加運算
__sub__: 減運算
__mul__: 乘運算
__div__: 除運算
__mod__: 求餘運算
__pow__: 乘方

錯誤和異常處理

Python有兩種錯誤很容易辨認:語法錯誤和異常 在執行Python程式的時候,即便語法正確,也有可能發生錯誤。執行期檢測到的錯誤被稱為異常。

異常處理

try語句按照如下方式工作; 首先,執行try子句(在關鍵字try和關鍵字except之間的語句) 如果沒有異常發生,忽略except子句,try子句執行後結束。 如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。 如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

###一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行;
###except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組;
###try except 語句還有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行;

import sys
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err: 
    print("OS error: {0}".format(err))
except (RuntimeError, TypeError, NameError):
    print("Could not convert data to an integer.")
else:
    print('ok !')
    f.close()

異常丟擲

raise 唯一的一個引數指定了要被丟擲的異常。它必須是一個異常的例項或者是異常的類;

這裡寫程式碼片

重點內容

參考文章: 廖雪峰,菜鳥教程,w3cschool教程