詳解python中的物件導向(上)

2020-10-25 12:00:46

定義一個類

# 定義一個類
class Dog():
    pass

# 範例化一個類
d1 = Dog()
d2 = Dog()

# 給範例賦予一個屬性name
d1.name = '大黃'

print(d1.name)

在__init__()方法中新增屬性

# 定義一個類
class Dog():

    def __init__(self,name,height,blood,power):
        self.name = name
        self.height = height
        self.blood = blood
        self.power = power

# 範例化一個類並給屬性賦值
d1 = Dog('大黃',0.7,10,3)
d2 = Dog('二黑',0.5,10,4)

# 輸出範例的屬性值
print d1.name
print d2.name

self和預設屬性

self就代表當前範例,在我們建立範例的時候,模板中的self就代表了我們的範例,我們可以通過self存取當前範例的屬性、呼叫當前範例的方法

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,blood,power):
    	# 此時self代表了我們要定義的範例
        self.name = name
        self.height = height
        self.blood = blood
        self.power = power

# 範例化一個類並給屬性賦值
d1 = Dog('大黃',0.7,10,3)
d2 = Dog('二黑',0.5,10,4)

# 輸出範例的屬性值
print d1.name
print d2.name
  • 預設屬性

在我們起初定義方法的時候,會有預設屬性存在,比如說血量,一開始就是滿血10滴,所以它就是預設屬性,我們不需要在方法的引數中給它傳值,直接在方法的屬性中定義好即可:

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power

# 範例化一個類並給屬性賦值
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)

# 輸出範例的屬性值
print d1.name
print d2.name
print d1.blood
print d2.blood

存取屬性和修改屬性

這個挺簡單的,print輸出範例屬性,隨後再給範例屬性重新賦值:

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power

# 範例化一個類並給屬性賦值
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)

# 輸出範例的屬性值
print d1.power
# 修改範例的屬性
d1.power = 9999
# 輸出
print d1.power

建立範例和建立多個範例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/10/23 16:28
# @Author  : Shadow
# @Site    : 
# @File    : 簡單的類.py
# @Software: PyCharm

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power

# 建立多個範例
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)

# 輸出範例的屬性值
print d1.name
print d2.name

# 用id()輸出範例的記憶體地址
print id(d1)
print id(d2)

新增和使用方法

現在我們要讓大黃二黑開始報自己的各項資料,所以新增一個方法bark():

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power
    # 新增一個方法bark
    def bark(self):
        print '我是{},身高{},攻擊力{},血量{}'.format(self.name,self.height,self.power,self.blood)

# 建立多個範例
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)
# 使用構造的方法
d1.bark()
d2.bark()

光叫也沒勁,我們構造一個attack()方法來讓他們打一架吧!

# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power
    # 新增一個方法bark
    def bark(self):
        print '我是{},身高{},攻擊力{},血量{}'.format(self.name,self.height,self.power,self.blood)
    # 再新增一個attack()方法來執行攻擊這個行為
    def attack(self,dog):
        dog.blood = dog.blood-self.power
        if dog.blood > 0:
            print '{}的剩餘血量為:{}'.format(dog.name,dog.blood)
        else:
            print '{}擊殺了{}!'.format(self.name,dog.name)

# 建立多個範例
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)

# 修改d1的攻擊力
d1.power = 999

# 使用構造的方法
d1.bark()
d2.bark()

# 使用attack()方法讓d1攻擊d2,並輸出d2的狀態
d1.attack(d2)

通過方法改變屬性

即定義一個可以修改實力屬性的方法,血量最低為0,不能出現負值,修改後的程式碼:

# -*- coding: gbk -*-


# 定義一個模板
class Dog():
    # 構造方法
    def __init__(self,name,height,power):
        self.name = name
        self.height = height
        # 設定血量為預設屬性,值為10
        self.blood = 10
        self.power = power
    # 新增一個方法bark
    def bark(self):
        print '我是{},身高{},攻擊力{},血量{}'.format(self.name,self.height,self.power,self.blood)
    # 修改attack方法,在attack中呼叫reduce_blood方法
    def attack(self,dog):
        dog.reduce_blood = dog.reduce_blood(self.power)
        if dog.blood > 0:
            print '{}的剩餘血量為:{}'.format(dog.name,dog.blood)
        else:
            print '{}擊殺了{}!'.format(self.name,dog.name)
    # 構造一個可以修改範例屬性值的方法reduce_blood
    def reduce_blood(self,reduce_value):
        if reduce_value > self.blood:
            self.blood = 0
        else:
            self.blood = self.blood - reduce_value
            

# 建立多個範例
d1 = Dog('大黃',0.7,3)
d2 = Dog('二黑',0.5,4)

# 使用構造的方法
# d1.bark()

# 通過方法reduce_blood()修改屬性
d1.attack(d2)

# 輸出詳細屬性
d2.bark()

綜合練習

汽車

建立一個名為Car的類,其方法__init__() 設定兩個屬性:name和brand(品牌)。
定義一個名為show()的方法,功能是列印出汽車的名稱和品牌。
定義一個名為run()的方法,列印:汽車XX跑起來了。其中XX表示汽車的name.
根據這個類建立一個名為car的範例,先通過屬性直接列印其兩個屬性,再呼叫上面的兩個方法。

# -*- coding: gbk -*-

# 建立一個名為Car的物件
class Car:
    
    # 構造__init__方法傳值並輸出name和brand
    def __init__(self,name,brand):
        self.name = name
        self.brand = brand
    # 構造show方法來輸出範例的屬性值
    def show(self):
        print self.name
        print self.brand
    # 構造run方法來讓汽車跑起來
    def run(self):
        print '{}跑起來了~'.format(self.name)


# 直接輸出範例的屬性
car = Car('Evo','Mitsubishi')
print car.name,car.brand

# 通過上面兩個方法輸出範例的屬性
car.show()
car.run()
5輛汽車

根據在練習1而編寫的類建立5個範例,並對每個範例呼叫show方法。

# -*- coding: gbk -*-

# 建立一個名為Car的物件
class Car:
    
    # 構造__init__方法傳值並輸出name和brand
    def __init__(self,name,brand):
        self.name = name
        self.brand = brand
    # 構造show方法來輸出範例的屬性值
    def show(self):
        print self.name
        print self.brand
    # 構造run方法來讓汽車跑起來
    def run(self):
        print '{}跑起來了~'.format(self.name)


# 建立5個範例,並對每個範例呼叫show方法
car1 = Car('Evo','三菱')
car2 = Car('翼豹','斯巴魯')
car3 = Car('Type-R','豐田')
car4 = Car('C63','賓士')
car5 = Car('GT-R','日產')

# 呼叫方法
car1.show()
car2.show()
car3.show()
car4.show()
car5.show()

Pig

建立一個名為Pig的類,其中包含屬性name和weight
定義一個名為show()方法,列印Pig的基本資訊;
再定義一個名為run() 的方法,列印:‘XX: 沒吃過豬肉,讓你看看豬跑!’。
建立多個表示不同豬的範例,並對每個範例都呼叫上述兩個方法。

# -*- coding: gbk -*-

# 建立Pig類
class Pig:
    # 構造__init__方法進行傳值
    def __init__(self,name,weight):
        self.name = name
        self.weight = weight
    # 構造show方法列印基本資訊
    def show(self):
        print '你好!我是{},我{}kg~'.format(self.name,self.weight)
    # 構造run方法輸出題目要求內容
    def run(self):
        print '{}:沒吃過豬肉,讓你看看豬跑~'.format(self.name)

# 範例化多個物件
pig1 = Pig('佩奇',90)
pig2 = Pig('喬治',60)

# pig1呼叫兩個方法
pig1.show()
pig1.run()

# pig2呼叫兩個方法
pig2.show()
pig2.run()
就餐人數

在為完成練習1的Car類中,新增一個名為number_of_people的屬性,並將其預設值設定為0。新增一個名為max_people的屬性,表示車上最多可以有幾個人。修改相應的構造方法,傳入max_people的值。
新增一個名為set_people() 的方法,它讓你能夠設定車上的人數,但是不能超過max_people的限制。
新增一個名為increase_people()的方法,每次呼叫這個方法就會讓車上的人數加1,但是不能超過max_people的限制。
新增一個名為reduce_people()的方法,每次呼叫這個方法就會讓車上的人數減少1,但是最多減少為0.
根據這個類建立一個名為car的範例,先通過屬性直接列印其兩個屬性,再呼叫上面的兩個方法。;列印有多少人在車上,然後多次呼叫以上3個方法,並列印車上的人數。

# -*- coding: gbk -*-

# 建立一個名為Car的物件
class Car:
    
    # 構造__init__方法傳值並輸出name和brand
    def __init__(self,name,brand,max_people=5):
        self.name = name
        self.brand = brand
        self.max_people = max_people
        self.number_of_people = 0
        
    # 構造show方法來輸出範例的屬性值
    def show(self):
        print '{}:當前車內人數為:{}'.format(self.name,self.number_of_people)

    # 構造run方法來讓汽車跑起來
    def run(self):
        print '{}跑起來了~'.format(self.name)

    # 構造set_people方法,設定車內初始人數
    def set_people(self,people):
        if people <= self.max_people:
            self.number_of_people = people
        else:
            print '超載啦!'

    # 構造increase_people方法,每次呼叫車內人數加一
    def increase_people(self):
        if self.number_of_people+1 <= self.max_people:
            self.number_of_people = self.number_of_people+1
        else:
            print '超載啦!'
            
    # 構造reduce_people方法,每次呼叫車內人數減一
    def reduce_people(self):
        if self.number_of_people-1 >= 0:
            self.number_of_people = self.number_of_people-1
        else:
            print '車裡已經沒人了!'

# 範例化物件car    
car = Car('Evo','三菱',5)

# 通過屬性範例直接列印出屬性name和brand
print car.name,car.brand

# 呼叫題目中要求的方法,並輸出車內人數
car.increase_people()
car.reduce_people()
car.show()

# 按照題目要求,多次呼叫以上3個方法,並列印車內人數
car.set_people(5)
car.reduce_people()
car.increase_people()
car.reduce_people()
car.reduce_people()
car.increase_people()
car.reduce_people()
car.show()
car.set_people(5)
car.reduce_people()
car.increase_people()
car.reduce_people()
car.show()
car.run()