1. 程式人生 > >python程式設計:從入門到實踐學習筆記-類

python程式設計:從入門到實踐學習筆記-類

面向物件程式設計時,都會遇到一個概念,,python也有這個概念,下面我們通過程式碼來深入瞭解下。

建立和使用類

class Dog():
    def __init__(self, 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('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

執行結果:
My dog's name is Willie.
My dog is 6 years old.

class關鍵字:來定義一個類。類名通常首字母為大寫。
__init__方法:特殊方法,每當例項類的時候都會執行。其中的形參self必不可少,而且必須位於最前面。
self形參:類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱,但是在呼叫這個方法的時候用不為這個引數賦值,Python會提供這個值。這個特別的變數指物件本身。

例項的方法是指定類名以及需要傳入的實參。
要訪問例項的屬性或者呼叫方法,可使用句點表示法

使用類和例項

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0 #<- here

    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.read_odometer()

執行結果:
2016 Audi A4

可以看到,我們給Car類的屬性指定了預設值self.odometer_reading = 0。如果要修改它,我們可以通過例項直接訪問它並修改,比如:my_new_car.odometer_reading = 23。或者通過方法修改屬性的值。或者通過方法對屬性的值進行遞增。

class Car():
    --snip--    
    #通過方法修改屬性的值
    def update_odometer(self, mileage):
        self.odometer_reading = mileage

    #通過方法對屬性的值進行遞增
    def increment_odometer(self, miles):
        self.odometer_reading += miles

繼承

一個類繼承另一個類時,他將自動獲得另一個類的所有屬性和方法;原有的類稱為父類,新類稱為子類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。
現在我們有一個Car類如下

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0 #<- here

    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 += miles

建立子類例項時,python首先給父類所有屬性賦值。
接下來我們建立新類EleCar

class Car():
    --snip--

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

首先父類必須位於子類前面。
super()是一個特殊函式,將父類和子類關聯起來。使得可呼叫子類的父類的方法__init__(),讓子類包父類的所有屬性。
給子類定義屬性和方法沒有任何限制,比如:

class Car():
    --snip--

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.

如果需要重寫父類的方法,只需定義一個與重寫的父類方法同名的方法即可。
python還可以使用其他類的例項作為自己類的屬性。

匯入類

類似函式,類也可以儲存為.py檔案形成模組從而進行匯入。
匯入單個類:
from model_name import class_name
匯入一個模組的多個類:
from model_name import class_name1, class_name2
匯入一個模組所有類:
from model_name import *
匯入整個模組:
import model_name
還可以在一個模組中匯入另一個模組

python標準庫

其是一組模組。模組collections中有一個類OrderedDict。字典的鍵值對沒有順序,但是這個類幾乎和字典相同,區別只在於記錄了鍵值對的順序。

from collections import OrderedDict

favorite_languages = OrderedDict()

favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'

for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " +
language.title() + ".")

執行結果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.