創建一個簡單的類
根據Dog類創建的每個實列都將存儲名字和年齡。我們賦予了每條小狗蹲下(sit())和打滾(roll_over())的能力:
1 class Dog(): 2 """一次模擬小狗的簡單嘗試""" 3 def __init__(self, name, age): 4 """初始化屬性name和age""" 5 self.name = name 6 self.age = age 7 def sit(self): 8 """模擬小狗被命令時蹲下""" 9 print(self.name.title() + "now is sitting.") 10 def roll_over(self): 11 """模擬小狗被命令時打滾""" 12 print(self.name.title() + "rolled over!") 13 my_dog = Dog('tom','3') 14 print("my dog name is " + my_dog.name.title() )
根據約定,在Python中,首字母大寫的名稱指的是類:類中的函數稱為
方法
方法__init__(),開頭和末尾都有2個下划線,這是一種約定,旨在避免Python默認方法與普通方法發生名稱的沖突。
我們將方法__init__()定義成了包含三個形參: self、 name和age。在這個方法的定義中,參self必不可少,還必須位於其他形參的前面。為何必須在方法定義中包含形參self呢?因為Python調用這個__init__()方法來創建Dog實例時,將自動傳入實參self。 兩個變量self_name和self_age都有前綴self,以self為前綴的變量都可供類中的所有方法使用,我們還可以通過類的任何實列來訪問這些變量。像這樣可通過實例訪問的變量稱為屬性。
在python2.X中,如果創建類需要在括號后面加上(object)。
訪問屬性
繼續上面的例子,方法__init__()創建一個表示特定小狗的示例,並使用我們提供的值來設置屬性name和age,方法__init__()並未顯式地包含return語句,但python自動返回一個表示這條小狗的示例。我們將這個示例存儲在變量my_dog中。
class Dog(): """一次模擬小狗的簡單嘗試""" def __init__(self, name, age): """初始化屬性name和age""" self.name = name self.age = age def sit(self): """模擬小狗被命令時蹲下""" print(self.name.title() + " now is sitting.") def roll_over(self): """模擬小狗被命令時打滾""" print(self.name.title() + " rolled over!") my_dog = Dog('tom',3) print(my_dog.name) print(my_dog.age) #運行結果 tom 3
調用方法
class Dog(): """一次模擬小狗的簡單嘗試""" def __init__(self, name, age): """初始化屬性name和age""" self.name = name self.age = age def sit(self): """模擬小狗被命令時蹲下""" print(self.name.title() + " now is sitting.") def roll_over(self): """模擬小狗被命令時打滾""" print(self.name.title() + " rolled over!") my_dog = Dog('tom',3) my_dog.sit() my_dog.roll_over() #運行結果 Tom now is sitting. Tom rolled over!
根據Dog類創建實例后,就可以使用句點表示來調用Dog來定義的任何方法
創建多個實例
class Dog(): """一次模擬小狗的簡單嘗試""" def __init__(self, name, age): """初始化屬性name和age""" self.name = name self.age = age def sit(self): """模擬小狗被命令時蹲下""" print(self.name.title() + " now is sitting.") def roll_over(self): """模擬小狗被命令時打滾""" print(self.name.title() + " rolled over!") my_dog = Dog('tom',3) your_dog = Dog('Mei',2) print("My dog name is " + my_dog.name.title()) print("Your dog name is " + your_dog.name.title()) #運行結果 My dog name is Tom Your dog name is Mei
可按需求根據類創建任意數量的實例。
使用類和實例
給屬性指定默認值
類中的每個屬性都必須有初始值,哪怕這個值是0或空字符串,在有些情況下,如設置默認值時,在方法__init__()內指定這種初始值時可以的沒如果你對某個屬性這樣做了,就無需包含為他提供初始化的形參。
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name my_car = Car('audi', 'a4', '2017') print(my_car.model) print(my_car.get_descri_name()) #運行結果 a4 2017 a4 audi
直接修改屬性的值
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name my_car = Car('audi', 'a4', '2017') print(my_car.get_descri_name()) my_car.year = 2016 print(my_car.get_descri_name()) #運行結果 2017 a4 audi 2016 a4 audi
通過方法修改
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name def update(self, mile): """更新里程值""" if mile > self.odometer_reading: self.odometer_reading = mile else: print("You can't roll back an odometer") def increment_odometer(self,mile): """增加里程""" self.odometer_reading += mile def read_odometer(self): """打印汽車的里程""" print("This car has " + str(self.odometer_reading) + " miles on it.") my_car = Car('audi', 'a4', '2017') my_car.read_odometer() my_car.odometer_reading = 10 #直接修改里程值 my_car.update(200) #通過方法修改里程 my_car.read_odometer() my_car.increment_odometer(10) my_car.read_odometer() #運行結果 This car has 100 miles on it. This car has 200 miles on it. This car has 210 miles on it.
繼承
如果我們想再一個class繼承另一個類的屬性,可以在類后面括號中加入類的名稱,舉例如下:
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name def update(self, mile): """更新里程值""" if mile > self.odometer_reading: self.odometer_reading = mile else: print("You can't roll back an odometer") def increment_odometer(self,mile): """增加里程""" self.odometer_reading += mile def read_odometer(self): """打印汽車的里程""" print("This car has " + str(self.odometer_reading) + " miles on it.") 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_descri_name()) #運行結果 2016 model s tesla
為了繼承父類的屬性,還需要加入一個特殊的函數super(),幫助python將夫類和子類關聯起來。
在python2.X中,類supper的格式如下:
supper(Eletric,self).__init__(make, model, year)
給子類定義屬性和方法
讓一個類繼承另一個類后,可添加區分子類和父類所屬的新屬性和新方法。
將實例用作屬性
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name def update(self, mile): """更新里程值""" if mile > self.odometer_reading: self.odometer_reading = mile else: print("You can't roll back an odometer") def increment_odometer(self,mile): """增加里程""" self.odometer_reading += mile def read_odometer(self): """打印汽車的里程""" print("This car has " + str(self.odometer_reading) + " miles on it.") 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_descri_name()) my_tesla.battery.describe_battery() #運行結果 2016 model s tesla This car has a 70-kwh battery.
導入類
導入單個或者多個類
一個文件car.py
class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """汽車的初始化""" self.make = make self.model = model self.year = year self.odometer_reading = 100 def get_descri_name(self): """描述汽車""" long_name = str(self.year) + ' ' + self.model + ' ' + self.make return long_name def update(self, mile): """更新里程值""" if mile > self.odometer_reading: self.odometer_reading = mile else: print("You can't roll back an odometer") def increment_odometer(self,mile): """增加里程""" self.odometer_reading += mile def read_odometer(self): """打印汽車的里程""" print("This car has " + str(self.odometer_reading) + " miles on it.") 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_car.py,導入一個類
from car import Car my_car = Car('audi', 'a4', '2017')
一個模塊中可以存儲多個類,所以可以一次導入多個類
from car import Car,Battery,ElectricCar my_tesla = ElectricCar('tesla', 'model s', '2016') print(my_tesla.get_descri_name()) my_tesla.battery.describe_battery()
導入整個模塊
import car #導入整個模塊的時候,需要使用句點表示法訪問需要的類 my_tesla = car.ElectricCar('tesla', 'model s', '2016') print(my_tesla.battery)
導入所有類
from car import * #導入所有的類