創建和使用類
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())
