創建和使用類
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!")
方法__init__() 是一個特殊的方法,每當你根 據Dog 類創建新實例時,Python都會自動運行它。在這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python默認方法與普通方法發生名稱衝突。
方法__init__() 定義成了包含三個形參:self 、name 和age 。在這個方法的定義中,形參self 必不可少,還必須位於其他形參的前面。爲何必須在方法定義中包 含形參self 呢?因爲Python調用這個__init__() 方法來創建Dog 實例時,將自動傳入實參self 。每個與類相關聯的方法調用都自動傳遞實參self ,它是一個指向實例本身 的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog 實例時,Python將調用Dog 類的方法__init__() 。我們將通過實參向Dog() 傳遞名字和年齡;self 會自動傳遞, 因此我們不需要傳遞它。每當我們根據Dog 類創建實例時,都只需給最後兩個形參(name 和age )提供值。
#創建對象
my_dog = Dog('willie', 6)
#訪問屬性my_dog.name
print("My dog's name is " + my_dog.name.title() + ".")
#訪問屬性my_dog.age
print("My dog is " + str(my_dog.age) + " years old.")
#訪問對象方法
my_dog.sit()
my_dog.roll_over()
#輸出
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Willie rolled over!
給屬性指定默認值
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):
return str(self.year)+" "+self.make.title()+" "+self.model.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.read_odometer()
#輸出
2016 Audi A4
This car has 0 miles on it.
修改屬性的值
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
#輸出
2016 Audi A4
This car has 23 miles on it.
通過方法修改屬性的值
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):
return str(self.year)+" "+self.make.title()+" "+self.model.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(23)
my_new_car.read_odometer()
#輸出
2016 Audi A4
This car has 23 miles on it.
繼承
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):
return str(self.year)+" "+self.make.title()+" "+self.model.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
#繼承Car
class ElectricCar(Car):
"""電動汽車的獨特之處"""
def __init__(self, make, model, year):
"""初始化父類的屬性"""
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
#輸出
2016 Tesla Model S
給子類定義屬性和方法
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', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
#輸出
2016 Tesla Model S
This car has a 70-kWh battery.
重寫父類的方法
可在子類中定義一個這樣的方法,即它與要重寫的父類方法同名
將實例用作屬性
class Battery():
"""一次模擬電動汽車電瓶的簡單嘗試"""
def __init__(self, battery_size=70):
"""初始化電瓶的屬性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一條描述電瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
class ElectricCar(Car):
"""電動汽車的獨特之處"""
def __init__(self, make, model, year):
""" 初始化父類的屬性,再初始化電動汽車特有的屬性"""
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
#輸出
2016 Tesla Model S
This car has a 70-kWh battery.
導入類
導入單個類
#Car 是Car類的存放文件car.py
from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
#輸出
2016 Audi A4
This car has 23 miles on it.
從一個模塊中導入多個類
#從car.py文件裏導入Car, ElectricCar類
from car import Car, ElectricCar
導入整個模塊 (非類裏的包括屬性、方法)
import car
導入模塊中的所有類
from module_name import *
在一個模塊中導入另一個模塊
electric_car.py
"""一組可用於表示電動汽車的類"""
from car import Car
class Battery():
--snip--
class ElectricC
car.py
"""一個可用於表示汽車的類"""
class Car():
--snip--
my_cars.py
from car import Car
from electric_car import ElectricCar
my_beetle = Car('volkswagen', 'beetle', 2016)
print(my_beetle.get_descriptive_name())
my_tesla = ElectricCar('tesla', 'roadster', 2016)
print(my_tesla.get_descriptive_name())
#輸出
2016 Volkswagen Beetle
2016 Tesla Roadster
Python標準庫
Python標準庫 是一組模塊,安裝的Python都包含它。你現在對類的工作原理已有大致的瞭解,可以開始使用其他程序員編寫好的模塊了。可使用標準庫中的任何函數和類,爲此 只需在程序開頭包含一條簡單的import 語句。
from collections import OrderedDict
from random import randint
x = randint(1, 6)
類編碼風格
類名應採用駝峯命名法 ,即將類名中的每個單詞的首字母都大寫,而不使用下劃線。實例名和模塊名都採用小寫格式,並在單詞之間加上下劃線。
在類定義後面包含一個文檔字符串。這種文檔字符串簡要地描述類的功能,