Python基礎語法介紹 - 面向對象(下)、異常處理、包和模塊

概述:

上一節主要介紹了面向對象的一些基本概念:類,類的組成元素“方法和屬性”,類的特性“繼承,多態和封裝”。這一節課分爲三部分:
(一)類屬性、類方法及調用、靜態方法及調用和單例類
(二)異常處理
(三)包和模塊

第一部分:類方法、靜態方法和單例類

類屬性
(1)類屬性區別於實例的屬性,類屬性屬於類對象,被實例對象所共享
(2)查找屬性規則:先實例對象的實例屬性;後類對象的類(?)屬性
(3)通過實例對象不能修改類屬性的值;如果修改的屬性在實例中不存在,則動態添加實例屬性

class Person:
    sum_num = 0

    def __init__(self):
        Person.sum_num += 1 #修改類屬性值,每創建一個實例對象,類屬性值加1

#實例對象p1和類對象的類屬性值一致
p1 = Person("zhangsan")
print(p1.sum_num, Person.sum_num)

#通過實例對象不能修改類屬性值,如果修改的屬性在實例總不存在,則動態添加實例屬性
p1.sum_num = 100
print(p1.sum_num, Person.sum_num)

類方法及調用

(1)使用@classmethod修飾的方法,第一個參數是cls
(2)類方法操作類屬性;實例方法操作實例對象屬性
(3)調用方式:類名.類方法();實例對象.類方法() #不推薦用此方法調用類方法

class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

        #類方法
    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

靜態方法及調用

(1)使用@staticmethod修飾的方法,不需要傳入任何參數
(2)應用在跟類和對象沒有關係的一些功能上。儘量少用靜態方法。

#靜態方法
@staticmethod
def is_date_valid(date_as_string):
    day, month, year = map(int, date_as_string.split('-'))
    return day <= 31 and month <= 12 and year <= 3999

單例類
(1)new(cls)是超類object類內置的方法。參數cls是類對象
(2)用戶創建對象,返回創建對象的引用。

#通過id(cls)可以查看類對象以及實例對象的地址
class DataBaseObj(object):
    def __init__(self):                                  #對象初始化
        print("-------init 構造函數-------")

    def __new__(cls):                                 #構造對象
        print("cls_id:" id(cls))
        return object.__new__(cls)                 #返回對象的引用

(2)在整個程序系統中,只有一個實例對象。概念等同設計模式中的singleton模式。

class SingleInstance:
    __instance = None
    def __init__(self):
        print("-----init-----")

    def __new__(cls):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

s1 = SingleInstance()
print(id(s1))
s2 = SingleInstance()
print(id(s2))

第二部分:異常處理

(1)捕獲異常

try:
    邏輯代碼
except ExceptionType as err:
    異常處理

(2)捕獲多個異常

try:
    邏輯代碼
except (ExceptionType1, ExceptionType2, ...) as err:
    異常處理

(3)捕獲所有可能發生的異常

try:
    邏輯代碼
except Exception as err:
    異常處理

(4)finally

try:
    邏輯代碼
except Exception as err:
    異常處理
finally:     
    代碼塊 (無論是否有異常發生,代碼都會執行到這裏)

(4)異常處理的意義:

  • 防止某個業務產生異常而影響到整個程序中的其他業務
  • 異常處理的本質不是解決異常,而是將出現異常時的不良影響降到最低

第三部分:包和模塊

Python項目結構:
(1)1個項目:n個包
(2)一個包:n個模塊
(3)模塊的名字:以.py爲擴展名命名的文件
引入模塊的方法:
(1)導入一個模塊:import model_name 或者 import module_name.model_name
(2)導入多個模塊:import model_name1, model_name2, ...
(3)導入某個模塊中的函數:from model_name import fun1, fun2
import model_name Vs from model_name import fun
(1)前者是導入一模塊,如果想引用模塊的內容(class, method,variables...)必須用全名,即 [module_name].[attr_name]。
(2)後者是導入某一指定對象(class, 其它對象...), 然後就可以直接用這些對象,不需要加上[module_name], 即[attr_name]。
特別用法:
(1)如果你只想導入一個包裏面的某個模塊被其他包所使用,你可以在init.py文件裏添加一句:all = ["model_name"]
(2)批量導入:from package import *;(1)對(2)起約束作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章