天天看點

Python基礎程式設計——類(一)

Python基礎程式設計——類(一)

建立和使用類

使用類幾乎可以模拟任何東西。根據Dog類建立的每個示例都将存儲名字和年齡。

class Dog():
    """一次模拟小狗的簡單嘗試"""

    def __init__(self,name,age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被指令時蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被指令時打滾"""
        print(self.name.title() + " rolled over!")
           

首先,我們定義了一個名為Dog的類。在Python中,首字母大寫的名稱指的是類。這個類定義中的括号是空的,因為我們要從空白建立這個類。

下方,編寫了一個文檔字元串,對這個類的功能進行描述。

init()是一個特殊的方法,每當你根據Dog類建立新執行個體時,Python都會自動運作它,這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,避免Python預設方法與普通方法發生名稱沖突。

定義的兩個變量都有字首self。字首的變量都可供類中的所有方法使用,還可以通過類的任何執行個體來通路這些變量。self.name = name擷取存儲在形參name中的值,并将其存儲到變量name中,然後該變量被關聯到目前建立的執行個體。

dog類還定義了另外兩個方法:sit()和roll_over()。由于這些方法不需要額外的資訊,如名字或年齡,他們隻有一個形參self。

根據類建立執行個體

class Dog():
    """一次模拟小狗的簡單嘗試"""

    def __init__(self, name, age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被指令時蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被指令時打滾"""
        print(self.name.title() + " rolled over!")

my_dog = Dog('while', 6)

print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
           

我們讓Python建立一條名字為'while'、年齡為6的小狗。Python使用實參'while'和6調用Dog類中方法int()。方法int()建立一個表示特定小狗的示例,并使用我們提供的值來設定屬性name和age。方法int()并未顯示地包含return語句,但Python自動傳回一個表示這條小狗的執行個體。将這個執行個體存儲在變量my_dog中。

1.通路屬性:要通路執行個體的屬性,可使用句點表示法。來通路my_dog的屬性name的值:my_dog.name,輸出如下:

Python基礎程式設計——類(一)

2.調用方法:調用dog類建立執行個體後,可以使用句點表示法來調用dog類中定義的任何方法。

class Dog():
    """一次模拟小狗的簡單嘗試"""

    def __init__(self,name,age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被指令時蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被指令時打滾"""
        print(self.name.title() + " rolled over!")

my_dog = Dog('while',6)

my_dog.sit()
my_dog.roll_over()
           

要調用方法,可指定執行個體的名稱和要調用的方法,并用句點分隔它們,遇到代碼my_dog.sit()時,Python在類dog中查找方法sit()并運作其代碼。

Python基礎程式設計——類(一)

3.建立多個執行個體:可按需求根據類建立任意數量的執行個體。

class Dog():
    """一次模拟小狗的簡單嘗試"""

    def __init__(self,name,age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被指令時蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被指令時打滾"""
        print(self.name.title() + " rolled over!")

my_dog = Dog('while',6)
your_dog = Dog('lucy', 3)

print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

my_dog.sit()

print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
           

建立了兩條小狗,分别名為willie和lucy。每條小狗都是一個獨立的執行個體,有自己的一組屬性,能夠執行相同的操作:

Python基礎程式設計——類(一)

使用類和執行個體

可以使用類來模拟現實世界中的很多情景。類編寫好後,你的大部分時間都花在使用根據類建立的執行個體上。你需要執行的一個重要任務是修改執行個體的屬性。你可以直接修改執行個體的屬性,也可以編寫方法以特定的方式進行修改。

class Car():
    """一次模拟汽車的簡單嘗試"""

    def __init__(self,make,model,year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        """傳回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

my_new_car = Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
           

首先定義了方法init()。與前面的dog類中一樣,這個方法的第一個形參為self;另外三個形參:make、model和year。方法init()接受這些形參的值,并将它們村粗在根據這個類建立的執行個體的屬性中。

然後定義了一個名為get_descriptive_name()的方法,它使用屬性year、make和model建立了一個對汽車進行描述的字元串,無需分别列印每個屬性的值。根據Car類建立了一個執行個體,并将其存儲到變量my_new_car中。

Python基礎程式設計——類(一)

給屬性指定預設值

類中的每個屬性都必須有初始值,哪怕這個值是0或空字元串。在有些情況下,如設定預設值時,在方法init()内指定這種初始值是可行的;如果你對某個屬性這樣做了,就無需包含為它提供初始值的形參。

"""一次模拟汽車的簡單嘗試"""

def __init__(self,make,model,year):
    """初始化描述汽車的屬性"""
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0

def get_descriptive_name(self):
    """傳回整潔的描述性資訊"""
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()

def red_odometer(self):
    """列印一條指出汽車裡程的資訊"""
    print("This car has " + str(self.odometer_reading) +  " miles on it.")
           

添加一個名為odometer_reading的屬性,其初始值為0。read_odometer()的方法,用于讀取汽車的裡程表;

當Python調用方法init()來建立新執行個體時,将像前一個示例一樣以屬性的方式存儲制造商、星号和生産年份。

Python基礎程式設計——類(一)

修改屬性的值

1.直接修改屬性的值:要修改屬性的值,最簡單的方式是通過執行個體直接通路它。

class Car():
    """一次模拟汽車的簡單嘗試"""

    def __init__(self,make,model,year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """傳回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """列印一條指出汽車裡程的資訊"""
        print("This car has " + str(self.odometer_reading) +  " miles on it.")

my_new_car = Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 80
my_new_car.read_odometer()
           

我們使用句點表示法來直接通路并設定汽車的屬性odometer_reading。這行代碼讓Python在執行個體my_new_car中找到屬性odometer_reading,并将該屬性的值設定為80;

Python基礎程式設計——類(一)

2.通過方法修改屬性的值:無需直接通路屬性,而可将值傳遞給一個方法,由它在内部進行更新。

class Car():
    """一次模拟汽車的簡單嘗試"""

    def __init__(self,make,model,year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """傳回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """列印一條指出汽車裡程的資訊"""
        print("This car has " + str(self.odometer_reading) +  " miles on it.")

    def update_odometer(self,mileage):
        """将裡程表讀數設定為指定的值"""
        self.odometer_reading = mileage

my_new_car = Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())

my_new_car.update_odometer(80)
my_new_car.read_odometer()
           

對Car類所做的唯一修改是添加了方法update_odometer()。這個方法接受一個裡程值,并将其存儲到self.odometer_reading中。

調用了update_odometer(),并向它提供了實參80(該實參對應于方法定義中的形參mileage)。将裡程數設定為80,而read_odometer()列印該讀數:

Python基礎程式設計——類(一)

可對方法update_odometer()進行擴充,使其在修改裡程表讀數是做些額外的工作。

class Car():
    """一次模拟汽車的簡單嘗試"""

    def __init__(self,make,model,year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """傳回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """列印一條指出汽車裡程的資訊"""
        print("This car has " + str(self.odometer_reading) +  " miles on it.")

    def update_odometer(self,mileage):
        """
        将裡程表讀數設定為指定的值
        禁止将裡程表讀數往回調
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
           

現在,update_odometer()在修改屬性前檢查指定的讀數是否合理。如果新指定的裡程(meileage)大于或等于原來的裡程(self.odometer_reading),就将裡程表讀數改為新指定的裡程;否則就發出警告,指出不能将裡程表往回撥。

3.通過方法對屬性的值進行遞增:将屬性值遞增特定的量,而不是将其設定為全新的值。

class Car():
    """一次模拟汽車的簡單嘗試"""

    def __init__(self, make, model, year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """傳回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """列印一條指出汽車裡程的資訊"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")

    def update_odometer(self, mileage):
        """
        将裡程表讀數設定為指定的值
        禁止将裡程表讀數往回調
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self, miles):
        """将裡程表讀數增加指定的量"""
        self.odometer_reading += miles

my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()