1. 程式人生 > >python-類-從入門到精通(一)

python-類-從入門到精通(一)

0.什麼是類

類(Class)是面向物件程式設計(OOP,Object-Oriented Programming)實現資訊封裝的基礎。類是一種使用者定義型別,也稱類型別。每個類包含資料說明和一組操作資料或傳遞訊息的函式。類的例項稱為物件。

面向物件程式設計是最有效的軟體編寫方法之一。在面向物件程式設計中,我們用類定義一類物件的通用行為,而用類建立的物件則都具有這種通用行為,然後可以根據需要賦予每個物件獨立的特性。

在類中,我們把根據類建立物件這個過程稱為例項化

通俗地理解:每個人都有類似的特徵,比如都有一個頭、兩隻手和兩條腿,我們都稱為“人”,那麼“人”就可以稱作一個類,是一個虛指的概念。但我們知道我們雖然特徵都是一樣的,但每個人都是不同的,比如有不同的身高,體重,膚色等,這些特徵是每個人特有的,不能一概而論。不同的人,都屬於“人”這個類,但不同的特性表明了這不是同一個個體,所以每個人都是一個例項,是實實在在的存在。

 

1.建立類

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')

在類中,我們把函式稱為方法,把變數稱為屬性。

Dog類中,第一個特殊的方法是__init__(),這個方法在建立新的例項時,Python都會自動執行它。

注意,init前後都有兩道下劃線,這是一種約定,只在避免Python預設方法與不同方法名稱衝突。

在類的方法中,都有一個self引數,新手只需要記住,這個引數必不可少,還必須位於其他引數前面。在傳參的時候,忽略self引數即可,python會幫助我們完成self引數的處理。

self實際上是一個指向例項本身的引用。在Python呼叫__init__()方法來建立例項的時候,將自動傳入實參self。每個與類相關聯的方法在呼叫時,都會自動傳遞實參self,讓例項能夠訪問類的屬性和方法。比如,本例中的類在例項化的時候,會自動呼叫_init__方法,通過實參向Dog類傳遞了name和age。由於self的自動傳遞功能,使得我們在建立Dog例項的時候,只需要提供兩個形參(name,age),那麼類中的所有方法都可以訪問這兩個引數。

 

2.例項化

前面一節,我們定義了一個Dog類,下面我們建立一個Dog的例項,展示類的使用方法。

my_dog = Dog('willie',6)
your_dog = Dog('lucy',3)

print("My dog's name is " + my_dog.name.title() + ".")
print("My dog's is " + str(my_dog.age) + "years old.")
my_dog.sit()

print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog's is " + str(your_dog.age) + "years old.")
your_dog.sit()

我們根據類的定義,建立了兩個例項:

一個是my_dog:並傳入引數,name='willie' , age=6

一個是your_dog:並傳入引數,name='lucy' , age=3

通過呼叫類中定義的方法:sit(),不同的類的例項,會有不同的sit()輸出。

這正是類的核心思想,屬於同一個類的不同例項,擁有類似的形式,但卻有著不同的內容。

 

3.新增帶預設值的屬性

一個類中,可能會用到很多屬性,但這些屬性不一定都需要通過形參傳入。

class Room():
    def __init__(self,seats):
        self.seats = seats
        self.customer = 0

    def enter(self):
        if self.customer <= self.seats:
            print("Enter,please!")
            self.customer += 1
        else:
            print("Sorry,no seat available!")

比如,這裡我們定義了一個房間的類,例項化的時候,我們傳入房間的座位數。但是,當有顧客進入的時候,我們需要房間內是否還有空座位。因此,在__init__方法中,我們定義了一個customer=0 的計數器,用於統計房間內人數。這個計數器初值通常來說都是0,所以我們並不需要把它作為引數傳入,而是直接賦初值0即可。

當我們在類中需要使用一些變數的時候,也可以通過這樣的方式建立。建立後的屬性,類中的所有方法都可以訪問到。

 

4.修改屬性的值

修改屬性的值有兩種方式:

  1. 直接例項名.屬性名的方式修改,比如my_dog.age = 7
  2. 利用類中的方法修改,比如在類中新增update的方法,在方法中修改屬性值。
my_dog = Dog('willie',6)
print("My dog's is " + str(my_dog.age) + "years old.")
print("One year later")
my_dog.age = 7
print("My dog's is " + str(my_dog.age) + "years old.")

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')

    def grow_up(self):
        self.age = self.age + 1

my_dog = Dog('willie',6)
print("My dog's is " + str(my_dog.age) + "years old.")
print("One year later")
my_dog.grow_up()
print("My dog's is " + str(my_dog.age) + "years old.")