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