1. 程式人生 > >面向物件程式設計(OOP)

面向物件程式設計(OOP)

面向物件:

    把一切看做物件(例項),用各種物件之間的關係來描述事務

物件:

    定義:

        現實生活中的物體或實體

    特徵:

        物件有很多屬性(名詞或形容詞)         年齡,姓名,性別...

        物件有很多行為(動作,動詞)           學習,吃飯,睡覺,工作...

類:

    擁有相同屬性和行為的物件分為一組,即一個類

    類是用來描述物件的工具,用類可以建立此類的物件(例項)

    類和物件示意:

        車(類)   ----------->   BYD  E6(京A.88888)(例項,物件)

                  ----------->   BMW  X5(京B.00000)(例項,物件)

        狗(類)   ----------->   哈士奇(戶籍號:00001)(例項,物件)

                  ----------->   金毛(戶籍號:00002)(例項,物件)

        int(類)   ----------->   100(例項,物件)

                  ----------->   200(例項,物件)

class語句:

        語法:

            class 類名(繼承列表):
                '''類文件字串'''
                例項方法定義
                類變數定義
                類方法定義(@classmethod)
                靜態方法定義(@staticmethod)

        作用:

            建立一個類
            類用於描述物件的行為和屬性
            類用於建立此類的一個或多個物件(例項)

        說明:

            類名必須為識別符號(與變數名命名規則相同,建議首字母大寫)
            類名實質上就是變數,它繫結一個類

        示例:
class Dog:
    '''建立一個Dog類,此類用於描述一種小動物的屬性和行為'''
    pass


dog1 = Dog()
print(id(dog1))

dog2 = Dog()
print(id(dog2))

print('----------------')

# 對比
lst1 = list()
print(id(lst1))

lst2 = list()
print(id(lst2))

建構函式:

    呼叫表示式:

        類名([建立傳參列表])

    作用:

        建立這個類的例項物件,並返回此例項物件的引用關係

    說明:

        例項也有自己的作用域和名稱空間,可以為該例項新增例項變數(屬性)

        例項可以呼叫類方法和例項方法

        例項可以訪問類變數和例項變數

例項方法:

    語法:

        class 類名(繼承列表):

            def 例項方法名(self, 形參名1, 形參名2, ...):
                '方法文件字串'
                語句塊

    作用:

        描述一個物件的行為,讓此類的全部物件都擁有相同的行為

    說明:

        例項方法的實質是函式,是定義在類內的函式

        例項方法至少有一個形參,第一個形參用來繫結呼叫這個方法的例項,一般命名為"self"

    呼叫:

        例項.例項方法名(呼叫傳參)
        或
        類名.例項方法名(例項, 呼叫傳參)

    示例:

# 此示例示意例項方法的定義和呼叫
class Dog:
    '''建立一個Dog類,此類用於描述一種小動物的屬性和行為'''
    def eat(self, food):
        '''此方法用來描述小狗吃東西的行為'''
        print('小狗正在吃' + food)

    def sleep(self):
        print("小狗在睡覺")

    def play(self, obj):
        print("小狗在玩" + obj)


dog1 = Dog()
dog1.eat("狗糧")
dog1.play("球")

dog2 = Dog()
dog2.eat("骨頭")
dog2.sleep()

例項屬性:

    每個例項可以有自己的變數用來儲存物件自己的資料,稱為例項變數(屬性)

    語法:

        例項.屬性名

    賦值規則:

        同變數的賦值規則

        首次為屬性賦值建立此屬性

        再次為屬性賦值改變屬性的繫結關係

    作用:

        記錄每個物件自身的資料

    示例:

# 此示例示意物件新增例項變數(屬性)及訪問例項變數(屬性)
class Dog:
    def eat(self, food):
        print(self.color, '的', self.kind, '正在吃', food)
        self.last_food = food

    def show_last_food(self):
        print(self.color, '的', self.kind, '上次吃的是', self.last_food)


dog1 = Dog()
dog1.kind = "京巴"
dog1.color = "白色"
dog1.color = "黑色"

dog2 = Dog()
dog2.kind = "藏獒"
dog2.color = "棕色"
print(dog1.color, '的', dog1.kind)
print(dog2.color, '的', dog2.kind)
dog1.eat("狗糧")
dog2.eat("骨頭")
dog1.show_last_food()
dog2.show_last_food()

初始化方法:

    作用:

        對新建立的物件新增屬性

    語法格式:

        class 類名(繼承列表):
            def __init__(self, [形參列表]):
                語句塊

    說明:

        初始化方法名必須為'__init__'不可改變
        
        初始化方法會在建構函式建立例項後自動呼叫,且將例項自身通過第一個引數self傳入__init__方法

        建構函式的實參將通過__init__方法的引數列表傳入到__init__方法中

        初始化方法內如果需要return 語句返回,則只能返回None

    示例:
    
# 此示例示意初始化方法的定義及使用初始化方法對新建物件新增屬性
class Car:

    def __init__(self, c, b, m):
        self.color = c
        self.brand = b
        self.model = m
        # print("初始化方法被呼叫")

    def run(self, speed):
        print(self.color, "的", self.brand, self.model,
              "正在以", speed, "公里/小時的速度行駛")


a4 = Car("紅色", "奧迪", "A4")
a4.run(199)

t1 = Car("藍色", "TESLA", "Model S")
t1.run(230)


析構方法:

    語法:

        class 類名(繼承列表):
            def __del__(self):
                語句塊

    作用:

        析構方法在物件被銷燬時自動呼叫

        python建議不要再物件銷燬時做任何事,因為銷燬時間不確定

    示例:

# 此示例示意析構方法的使用
class Car:

    def __init__(self, info):
        self.info = info
        print("汽車物件", self.info, "被建立")

    def __del__(self):
        print("汽車物件", self.info, "被銷燬")


c1 = Car("BYD")
# 改變c1繫結的物件,之前的物件被銷燬
c1 = None
# 刪除變數,釋放物件
del c1

L = []
L.append(Car("BMW"))
del L
input("請輸入回車鍵繼續執行程式:")

print("程式退出")


預置例項屬性:

    __dict__屬性:

        __dict__屬性繫結一個儲存此例項自身變數的字典

        示例:

            class Dog:
                pass
            dog1 = Dog()
            print(dog1.__dict__)    #{}
            dog1.color = "white"
            print(dog1.__dict__)    #{'color': 'white'}
            dog1.kind = "京巴"
            print(dog1.__dict__)    #{'color': 'whilte', 'kind': '京巴'}

    __class__屬性:

        "__class__"屬性繫結建立此例項的類

        作用:

            可以藉助此屬性訪問建立此例項的類

        示例:

            class Dog:
                pass
            dog1 = Dog()
            print(dog1.__class__)
            dog2 = dog1.__class__()
            print(dog2.__class__)

del語句:

    可以刪除物件(例項)的屬性

    語法:

        del 物件.例項變數名

    示例:

        class Dog:
            pass
        dog1 = Dog()
        dog1.color = 'white'
        print(dog1.color)
        del dog1.color
        print(dog1.color)

    小結:

        1)刪除變數
        2)刪除列表元素
        3)刪除字典的鍵,釋放值
        4)刪除物件的屬性

用於物件的函式:

    isinstance(obj, class_or_tuple)

        返回這個物件obj是否是某個類的物件或者某些類中的一個類的物件,如果是則返回True,否則返回False

    type(obj)

        返回物件型別

面向物件的綜合示例:

兩個人:

    屬性:

        1.姓名: 張三    年齡:35歲
        2.姓名: 李四    年齡:8歲

    行為:

        1.教別人學 teach
        2.工作賺錢 work
        3.借錢 borrow

事情:

    張三 教 李四 學 python

    李四 教 張三 學 王者榮耀

    張三 上班賺了 1000 塊

    李四 向 張三 借了 200 塊

    35 歲的 張三 有錢 800塊,他學會了技能: 王者榮耀

    8 歲的 李四 有錢 200塊,他學會了技能: python

   # example.py


class Human:

    def __init__(self, name, age, money=0):
        self.name = name
        self.age = age
        self.money = money
        self.skill = []

    def teach(self, obj, skill):
        obj.skill.append(skill)
        print(self.name, "教", obj.name, "學會了", skill)

    def work(self, money):
        self.money += money
        print(self.name, "工作賺了", money, "元")

    def borrow(self, obj, money):
        if self.money > money:
            self.money -= money
            obj.money += money
            print(self.name, "借了", obj.name, money, "元")
        else:
            print(self.name, "沒有借錢給", obj.name)

    def show_info(self):
        print(self.age, "歲的", self.name, "有錢", self.money,
              "元,他學會了技能:", self.skill[0])


h1 = Human("張三", 35)
h2 = Human("李四", 8)

h1.teach(h2, "python")
h2.teach(h1, "王者榮耀")
h1.work(1000)
h1.borrow(h2, 200)
h1.show_info()
h2.show_info()