天天看點

python開發day17 面向對象

Day17筆記

面向對象程式設計

Object-oriented programing

對象的意義 對象是指現實中的物體或實體
面向對象的意義 把一切看成對象(執行個體),用各種對象之間的關系來描述事務
對象的特征

1.對象有很多屬性(名詞)

姓名,性别,年齡,…

2.對象有很多行為(動作,動詞)

   學習,吃飯,睡覺,工作,….

示意

車(類)----àBYD e6  (京A.88888)    (執行個體,對象)

      \

       \----àBWM x5  (京B.6666)     (對象)

狗(類)---à 京巴 (戶籍号:000001)

       \

        \----à 導盲犬 (戶籍号:000002)

意義 1.擁有相同屬性和行為的對象分為一組,即為一個類
2.類是用來描述對象的工具,用類可以建立此類的對象(執行個體)

類的建立語句:

Class語句

文法 作用

Class 類名(繼承清單)

執行個體方法定義

類變量定義

類方法定義(@classmethod)

靜态方法定義(@staticmethod)

建立一個類

用于描述對象的行為和屬性

用于建立此類的一個或多個同類對象(執行個體)

說明

1.繼承清單可以省略,省略繼承清單表示類繼承自object

2.類名必須為辨別符

3.類名實質上是變量,他綁定一個類

示例

#定義一個簡單的類

class Dog:

    '''這個類用于描述一種小動物的行為和屬性'''

    pass

dog1 = Dog() #建立一個新的Dog類的對象

print(id(dog1))#列印這個對象的id

dog2 = Dog()#建立另外一個新的Dog類的對象

print(id(dog2))

#對比

lst1 = list()#建立一個空清單

print(id(lst1))

lst2 = list()#建立另外一個空清單

print(id(lst2))

構造函數

意義 構造函數調用表達式
類名([建立傳參清單])
作用 建立這個類的執行個體對象,并傳回此執行個體對象的引用關系
執行個體說明

1.執行個體有自己的作用域和名字空間,可以為該執行個體添加執行個體變量(也叫屬性)

2.執行個體可以調用類方法和執行個體方法

3.執行個體可以通路類變量和執行個體變量

執行個體方法 文法 作用

Class 類名(繼承清單)

Def 執行個體方法(srlf,形參1,形參2…)

用于描述一個對象的行為,讓此類型的全部對象都擁有相同的行為
說明

1.執行個體方法的實質是函數,是定義在類内的函數

2.執行個體方法至少有一個形參,第一個形參代表調用這個方法的執行個體,一般命名為‘self’

執行個體方法的調用文法

1.執行個體·執行個體方法名(調用傳參)

2.類名·執行個體方法名(執行個體,調用傳參)

示例:

class Dog:

    def infos(self):

        print(self.color, '的', self.kinds)

    def eat(self, food):

        '''

        當Dog類型的對象吃東西時,用food 屬性記住

        此對象吃的是什麼

        '''

        print(self.color, '的', self.kinds,

              '正在吃', food)

        self.food = food

    def food_info(self):

        print(self.color, '的', self.kinds,

            '上次吃的是', self.food)

dog1 = Dog()

dog1.kinds = '京巴'  # 為dog1綁定的Dog對象添加kinds屬性

dog1.color = '白色'  # 建立color執行個體變量

dog1.color = '黃色'  # 改變執行個體變量color的綁定關系

dog2 = Dog()  # 另一個對象

dog2.kinds = '導盲犬'

dog2.color = '黑色'

dog1.infos()

dog2.infos()

# print(dog1.color, '的', dog1.kinds)  # 擷取屬性的資料

# print(dog2.color, '的', dog2.kinds)

dog1.eat('骨頭')

dog1.food_info()

# dog2.food_info()  # dog2沒有food這個屬性,調用出錯

練習:

#定義一個描述人的資訊的類:Human

# class Human:

#     def set_info(self,n,a,addr = '不詳'):

#         '''此方法為人添加:姓名,年齡,家庭住址屬性'''

#         self.name = n

#         self.age = a

#         self.address = addr

#     def show_info(self):

#         '''此處顯示此人的資訊'''

#         print(self.name,'今年',self.age,'歲 家庭住址'

#                                     ,self.address )    

# h1 = Human()

# h1.set_info('小張','20','北京市朝陽區')

# h2 = Human()

# h2.set_info('小李','18')

# h1.show_info() #小張 今年 20 歲 家庭住址:

# h2.show_info()

執行個體屬性

執行個體屬性attribute(執行個體變量) 每個執行個體可以用自己的變量,稱為執行個體變量(也叫屬性)
使用文法 執行個體·屬性名

屬性的指派規則:

1. 首次為屬性指派則建立此屬性

2.再次為屬性指派則改變屬性的綁定關

作用 記錄每個對象自身的資料
删除屬性 del 語句
文法 del 對象·屬性名

示例:

class Dog:

    pass

dog1 = Dog()

dog1 = color = ‘白色’  #添加屬性

del = dog.color   #删除屬性

del總結

1)删除變量     del  a
2)删除清單中的元素 Del  L[0]
3)删除字典中鍵 Del d[‘name’]
4)删除對象的屬性 Del    dog1.color

初始化方法

作用 對新建立的對象添加屬性等初始化操作
文法格式

Class 類名(繼承清單):

Def _init_(self[,形參清單])

    語句塊

注:[ ]裡的内容代表可省略

說明

1. 初始化方法名必須為_init_不可改變

2. 初始化方法會在構造函數建立執行個體後自動調用,且将執行個體自身通過第一個參數self傳入del_init_方法

3. 構造函數的實參将通過_init_方法的參數清單傳入到_init_方法中

4. 初始化方法内如果需要return語句傳回,則隻能傳回None

示例:

# class car:

#     def __init__(self,clr,brand,model):

#         self.color = clr #顔色

#         self.brand = brand #品牌

#         self.model = model #型号

#         #print('car的初始化方法被調用')

#     def run(self,speed):

#         print(self.color,'的',self.brand,

#             self.model,'正在以',speed,

#                 '公裡/小時的速度行駛')

# c1 = car('紅色','奧迪','A6')

# c1.run(200)

# c2 = car('藍色','TESLAS','Model S')

# c2.run(150)

練習:

 寫一個學生類,用來描述學生資訊

     要求:

      1)為該類添加初始化方法,實作在建立對象時自動設定'姓名','年齡','成績'屬性

      2)添加set_score

        方法能為對象修改成績資訊,并限制成績在0~100之間

      3)添加show_info方法列印學生對象的資訊

class Student:

    def __init__(self,name,age,score=0):

        self.name = name

        self.age = age

        self.score = score

    def set_score(self,score):

        if 0 <= score <= 100:

            self.score = score

        else:

            #通知調用者,調用實參不合法

            raise ValueError('值不在相應的範圍内')

    def show_info(self):

        print(self.name,'今年',

            self.age,'歲'

              '  成績是',self.score)

    def get_score(self):

        return self.score

s1 = Student('小其',17,59)

s1.set_score(70)

s1.show_info()

print('s1綁定的對象為:',s1.get_score())

析構方法

文法

Class 類名(繼承清單):

Def __del__(self):

    語句塊

作用 通常用來釋放此對象占用的資源
說明

1. 析構方法會在對象被銷毀時自動調用

2. Python語句建議不要在對象銷毀時做任何事情,因為對象銷毀的時間難以确定

示例:

class Car:

    def __init__(self,name):

        self.name = name

        print("汽車",name,"對象被建立")

    def __del__(self):

        print("汽車",self.name,'對象被銷毀')

c1 = Car("BYD E6")

del c1

while  True:

print('程式結束')

預置的執行個體屬性

文法

__dict__屬性

  __dict__屬性綁定一個存儲此執行個體自身變量的字典

示例

class Dog:

    pass

dog1 = Dog()

print(dog1.__dict__)  #{}

dog1.color = "白色"

print(dog1.__dict__) #{'color':'白色'}

__class__屬性

文法 __class__屬性綁定建立此執行個體的類(類執行個體)
作用 可以借助于此屬性來通路建立此執行個體的類

示例:

class Dog:

    pass

dog1 = Dog()

print(dog1.__class__)

dog2 = dog1.__class__()

print(dog2.__class__)

使用者類的函數

種類 1.isinstance(obj, class__or__tuple) 2.Type(obj)
傳回這個對象obj是否是某個類的對象,或者某些類中的一個類的對象,如果是則傳回Ture,否則傳回False 傳回對象的類

示例:

#在互動模式下運作

isinstance (3.14,float) #Ture

isinstance(python,str)  #Ture

#在編輯器下運作

class Dog:

    pass

deg1 = Dog()

isinstance(dog1,Dog) #Ture

練習:

有兩個人(Human):

    1.姓名:張三 年齡:35

    2.姓名:李四 年齡:8

    行為:

        1.教别人學東西 teacd

         2.工作賺錢 work

         3.借錢  borrow

    用程式描述如下事情:

        張三 教 李四 學 python

        李四 教 張三 學 滑冰

        張三 上班 賺了 1000元錢

        李四 向 張三 借了 200元錢

        顯示李四的全部資訊

        顯示張三發全部資訊   

答案:

class Human:

    def __init__(self, name, age):

        #1建立函數加入姓名年齡

        self.name = name  # 姓名

        self.age = age  # 年齡

        self.money = 0  # 錢數

        self.skill = []  # 技能

    def teach(self, other, skl):

        #2建立函數得到新學技能(other)代表其他人

        other.skill.append(skl)  # other得到了技能

        print(self.name, '正在教', other.name,

              '學', skl)

    def work(self, money):

        #3建立函數上班賺了多少錢

        self.money += money

        print(self.name, '上班賺了', money, '元錢')

    def borrow(self, other, money):

        #4建立函數本人向(other)其他人借錢

        '''借錢成功傳回True,失敗傳回False'''

        # 先判斷other沒有沒錢借

        if other.money > money:

            other.money -= money

            self.money += money

            print(other.name, '借給了',

                  self.name, money, '元錢')

            return True

        print(other.name, '沒借給', self.name)

        return False  # 借錢失敗

    def show_info(self):

        #5建立函數綜合起來得到新的技能,有多少錢

        print(self.age, "歲的", self.name,

            '有技能:', self.skill, ',錢包内的錢數是',

            self.money)

zhang3 = Human("張三", 35)

li4 = Human('李四', 8)

#傳參給1

zhang3.teach(li4, 'python')#張三教李四學技能

li4.teach(zhang3, '滑冰')#李四教張三學技能

#傳參給2

zhang3.work(1000)  # 張三 上班 賺了 1000元錢

#傳參給3

li4.borrow(zhang3, 200)  # 李四 向 張三 借了 200元錢

#傳參給4

zhang3.show_info()

li4.show_info()

#傳參給5

練習:

        将之前的學生資訊管理

         原代碼中用字典來儲存每個學生資訊,現改為用對象來儲存每個學生的資訊

           學生類的存入子產品student.py中