class——python編程從入門到實踐


創建和使用類

1. 創建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!")

        編程趣事:上邊的代碼敲完之后,想試一下能不能用,就添加了一個實例運行了一下,結果一直報錯:takes no arguments,檢查和比較了好幾遍,都一樣呀,哪里的問題呢?結果把 init 敲成了 int ,但是在PyCharm和IDLE都顯示正常,太神奇啦!

        言歸正傳:Python中首字母大寫的名稱指的是類;類中的函數成為方法;__init__(self, )是默認方法;默認方法中形參self必須存在且位於最前邊,但創建實列時不需要提供值;以self為前綴的變量都可供類中的所有方法使用,還可通過實例訪問。

2. 根據類創建實例

my_dog = Dog('willie', 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.")
my_dog.roll_over()    # 調用方法

使用類和實例

1. Car類

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', '2019')    # 創建實例
print(my_new_car.get_descriptive_name())    # 調用類的方法

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.")    # 調用有默認值的屬性


my_new_car = Car('audi', 'a4', '2019')
print(my_new_car.get_descriptive_name()) 
my_new_car.read_odometer()    # 訪問類方法

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):
        """將里程數設為指定的值"""
        self.odometer_reading = mileage

    def increment_odometer(self, miles):
        """將里程讀數增加指定量"""
        self.odometer_reading = self.odometer_reading + miles


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

my_new_car.odometer_reading = 23    # 直接修改屬性的值
my_new_car.read_odometer()

my_new_car.update_odometer(66)    # 通過方法修改屬性
my_new_car.read_odometer()

my_new_car.increment_odometer(100)    # 通過方法對屬性的值遞增
my_new_car.read_odometer()

繼承

        要編寫的類時另一個現成類的特殊版本,就使用繼承。一個類繼承另一個類時,它將自動獲得另一個類的屬性和方法;原有的類稱為父類,而新的類稱為子類。子類繼承父類的所有屬性和方法,同時還可以定義自己的屬性和方法。

1. 子類的方法__init__( )

class ElectricCar(Car):    # 創建子類,括號中包含父類的名稱
    """電動汽車的獨特之處"""

    def __init__(self, make, model, year):    # 接受創建Car實例所需的信息
        """初始化父類的屬性"""
        super().__init__(make, model, year)    # 將子類和父類關聯起來,讓子類包含父類所有屬性。由此父類也稱為超類(superclass)


my_tesla = ElectricCar('tesla', 'model s', 2019)    # 創建一個實例存儲於變量中
print(my_tesla.get_descriptive_name())

 Note: 創建子類時,父類必須包含再當前文件中,且位於子類前邊。

2. 給子類定義屬性和方法

class ElectricCar(Car): 
    """電動汽車的獨特之處"""

    def __init__(self, make, model, year): 
        """初始化父類的屬性"""
        super().__init__(make, model, year) 
        self.battery_size = 70    # 給子類定義屬性,設置初始值

    def describe_battery(self):    # 給子類定義方法
        """打印一條描述電瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "kwh battery.")


my_tesla = ElectricCar('tesla', 'model s', 2019)  
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

3. 重寫父類的方法

在子類中定義一個與父類中方法同名的方法——重寫父類的方法。

4. 將實例用作屬性

class Battery:    # 定義新類
    """一次模擬電動汽車電瓶的簡單嘗試"""

    def __init__(self, battery_size=85):
        """初始化電瓶屬性"""
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一條描述電瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "kwh battery.")

    def get_range(self):    # 新增方法
        """打印一條消息,指出電瓶的續航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270

        message = "This car can go approximately " + str(range)
        message = message + " miles on a full charge."
        print(message)


class ElectricCar(Car):
    """電動汽車的獨特之處"""

    def __init__(self, make, model, year):
        """初始化父類的屬性"""
        super().__init__(make, model, year)
        self.battery = Battery()    # 創建一個新的Battery實例,並將該實例存儲在屬性中


my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()    # 在實例my_tesla中查找屬性battery,並對存儲在該屬性中的Battery實例調用方法describe_battery()
my_tesla.battery.get_range()    # 繼續通過屬性中的實例調用方法

導入類

不斷的給類添加新的功能,文件會變得越來越長,即便使用了繼承也是如此。為了讓文件盡可能整潔,可以將類存儲在模塊中,然后再在主程序中導入所需的模塊。

1. 導入單個模塊

car.py

"""一個可用於表示汽車的類"""


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.get_descriptive_name():
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self, miles):
        """將里程讀數增加指定量"""
        self.odometer_reading = self.odometer_reading + miles
my_car.py

from car import Car    #導入類
my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

2. 在一個模塊中存儲多個類

在car.py中添加以下代碼:

class Battery:
    """一次模擬電動汽車電瓶的簡單嘗試"""

    def __init__(self, battery_size=85):
        """初始化電瓶屬性"""
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一條描述電瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "kwh battery.")

    def get_range(self):    # 新增方法
        """打印一條消息,指出電瓶的續航里程"""
        global rg
        if self.battery_size == 70:
            rg = 240
        elif self.battery_size == 85:
            rg = 270

        message = "This car can go approximately" + str(rg)
        message = message + " miles on a full charge."
        print(message)


class ElectricCar(Car):
    """電動汽車的獨特之處"""

    def __init__(self, make, model, year):
        """初始化父類的屬性"""

        super().__init__(make, model, year)
        self.battery = Battery()

此時car.py中包含3個類,可以單獨導出其中的一個類使用:

my_electric_car.py

from car import ElectricCar

my_tesla = ElectricCar('tesla', 'roadster', 2019)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

3. 從一個模塊導入多個類

my_cars.py

from car import Car, ElectricCar    #導入一個模塊中的兩個類

my_beetle = Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())

 4. 導入整個模塊

my_cars.py

import car

my_beetle = car.Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())

my_tesla = car.ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())

5. 導入模塊中的所有類

導入模塊中的所有類,可使用一下語法:

from module_name import *

 但是,不推薦使用這種導入方式,避免引發名稱沖突。

6. 在一個模塊中導入另一個模塊

若將Car類存儲在一個模塊car.py中,將ElectricCar和Battery類存儲在模塊electriic_car.py中:

electriic_car.py

from car import Car

class Battery:
...
class ElectricCar(Car)
...

 

my_cars.py

from car import Car
from
electriic_car my_beetle = Car('volkswagen', 'beetle', 2019) print(my_beetle.get_descriptive_name()) my_tesla = ElectricCar('tesla', 'roadster', 2019) print(my_tesla.get_descriptive_name())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM