1. 程式人生 > 實用技巧 >Python基礎學習筆記(22)面向物件的名稱空間 組合

Python基礎學習筆記(22)面向物件的名稱空間 組合

Python基礎學習(22)面向物件的名稱空間 組合

一、今日大綱

  • 面向物件的名稱空間
  • 面向物件的組合

二、面向物件的名稱空間

  1. 物件和類的範圍

    拓展到之前我們學習過的基礎資料型別和函式,參考類的定義(內建一部分屬性和方法),可以獲知:之前學習到的一切基礎資料型別、函式、裝飾器、生成器、迭代器也是類。在 Python 中,一切皆為物件,而物件的型別就是類;

    • 123 的類是 int/float
    • {} 的類是 dict
    • alex = Person()的類是Person
    • xiaobai = Dog()的類是Dog
  2. 靜態變數/靜態屬性和繫結方法

    我們現在定義一個類A:

    class A:
        Country = '中國'  # 靜態變數/靜態屬性 儲存在類的名稱空間裡
        def __init__(self, name, age, country):  # 繫結方法 儲存在類的名稱空間
            self.name = name
            self.age = age
            self.Country = country
        def func1(self): pass  # 繫結方法 儲存在類的名稱空間
        def func2(self): pass
        def func3(self): pass
        def func4(self): pass
        def func5(self): pass
        def func6(self): pass
    

    類中直接定義的Country變數就是靜態變數/靜態屬性,它與__init__方法中定義的變數有以下不同點:

    • 物件中的變數只屬於物件本身,每個物件都有屬於自己的空間來儲存物件的變數;
    • 當使用物件名去呼叫某一個屬性的時候會優先在自己的空間中尋找,找不到再去對應的類中尋找;
    • 在物件的引用操作中如果物件自身沒有就會引用類的,如果類也沒有就會報錯;
    • 對於類來說,類中靜態變數所有物件都可以讀取,並且讀取的是同一份變數。
  3. 靜態變數/靜態屬性的用處

    • 靜態變數是所有由此類例項化的物件所共享的值,那麼這個變數應該被定義成靜態變數;
    • 所有和靜態變數相關的增刪改查都應該使用類名類處理,而不應該使用物件名直接修改靜態變數。
  4. 練習題

    實現一個類,能夠自動地統計這個類例項化了多少物件

    class Cls:
        cnt = 0
        def __init__(self):
            Cls.cnt += 1
    
    a = Cls()
    print(a.cnt)
    

三、面向物件的組合

面向物件中的組合就是:將一個物件作為屬性賦予給了一個類;可能現在還比較難理解,我們舉個例子:現在要開發一個教學系統,需要編寫一個學生類,其中包含性別、年齡、學號、班級、手機等資訊;對應地,我們還要編寫一個班級類,其中包含班級名字、開版時間、當前講師等。

# 學生類:性別 年齡 學號 班級 手機號
class Student:
    def __init__(self, name, gender, age, number, cls, phone):
        self.name = name
        self.gender = gender
        self.age = age
        self.number = number
        self.cls = cls
        self.phont = phone

# 班級資訊:班級名字、開班時間、當前講師
class ClS:
    def __init__(self, cname, begin, teacher):
        self.cname = cname
        self.begin = begin
        self.teacher = teacher
        
# 定義兩個學生和兩個班級
dazhuang = Student('dazhuang', 'male', 18, 27, 'python23', 13812012012)
xuefei = Student('xuefei', 'female', 18, 17, 'python22', 13812012013)
py22 = Cls('python22', '2019-04-26', 'xiaobai')
py23 = Cls('python23', '2019-05-28', 'baoyuan')

這時,加入我們想要檢視大壯和雪飛的班級的開班日期,我們為了更加簡便可以嘗試將班級物件作為引數傳到大壯和雪飛物件中去:

dazhuang = Student('dazhuang', 'male', 18, 27, py23, 13812012012)
xuefei = Student('xuefei', 'female', 18, 17, py22, 13812012013)

於是經過組合的操作後,我們就可以用下列方式檢視大壯的班級資訊了:

print(dazhuang.cls.begin)  # 2019-05-28

學會以上知識,我們可以做一個練習:

# 練習:
# 班級類包含一個屬性:課程
# 課程包含:課程名稱、週期、價格
# 建立兩個班級 linux57和python22
# 檢視linux57期的班級所學課程的價格
# 檢視python22期班級所學課程的週期
class Course:
    def __init__(self, cname, cycle, price):
        self.cname = cname
        self.cycle = cycle
        self.price = price

class Cls:
    def __init__(self, name, course):
        self.name = name
        self.course = course

母豬的產後護理 = Course('母豬的產後護理', '10 month', 20000)
忽悠 = Course('忽悠', '20 month', 1)
python22 = Cls('python22', 母豬的產後護理) 
linux57 = Cls('linux57', 忽悠)
print(linux57.course.price, python22.course.cycle)
 # 1 10 month