Python編程:從入門到實踐------第9章:類

面向對象編程是最有效的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情景的類,並基於這些類來創建對象。編寫類時,你定義一大類對象都有的通用行爲。基於類創建對象時,每個對象都自動具備這種通用行爲,然後可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情景,其逼真程度達到了令你驚訝的地步。

一、創建和使用類

1.創建Dog類

根據Dog 類創建的每個實例都將存儲名字和年齡。我們賦予了每條小狗蹲下(sit() )和打滾(roll_over() )的能力:

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!")

根據約定,在Python中,首字母大寫的名稱指的是類。這個類定義中的括號是空的,因爲我們要從空白創建這個類。

方法_init_()

類中的函數稱爲方法。其中_init_()是一個特殊的方法,每當你根據Dog類創建新實例時,python都會自動運行它。在這個方法中,開頭和結尾都有一條下劃線以避免衝突。

方法_init_()中的形參self必不可少,且必須位於首位。當Python調用這個_init_()方法來創建Dog實例時,將自動傳入實參self。每個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog實例時,python將調用Dog類的方法_init_()。我們將通過實參向Dog()傳遞名字和年齡;self會自動傳遞,因此我們不需要傳遞它。每當我們根據Dog創建實例時,都只需給最後兩個形參(age和name)提供值。

self.name和self.age兩個變量都有前綴self,以self爲前綴的變量可供類中的所有方法使用,我們還可以通過類的任何實例來訪問這些變量。通過語句 self.name = name 獲取存儲在形參name中的值,並將其存儲到變量name中,然後該變量被關聯到當前創建的實例。像這樣可通過實例訪問的變量稱爲屬性

2.根據類創建實例

class Dog():
	.....
	.....

my_dog = Dog('milk',3)

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

輸出如下:

My dog's name is Milk.
My dog is 3 years old.
Milk rolled over!

可通過句點運算符訪問屬性、調用方法。

動手試一試9-1 — 9-3

#9-1

print("\n9-1:\n")

class Restaurant():

    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        print(self.restaurant_name)
        print(self.cuisine_type)

    def open_restaurant(self):
        print("The "+self.cuisine_type+" restaurant named "+self.restaurant_name+" is open.")

hanhan_restaurant = Restaurant('hanhan', 'Chinese food')
hanhan_restaurant.describe_restaurant()
hanhan_restaurant.open_restaurant()

#9-2

print("\n9-2:\n")
a_restaurant = Restaurant('a','Chinese food')
a_restaurant.describe_restaurant()
a_restaurant.open_restaurant()


#9-3

print("\n9-3:\n")

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex

    def describe_user(self):
        print("first name:"+self.first_name)
        print("last_name:"+self.last_name)
        print("sex:"+self.sex)

    def greet_user(self):
        print("Hello,"+self.last_name.title()+" "+self.first_name.title()+"!")

a_user = User('goudan','li','man')
a_user.describe_user()
a_user.greet_user()

輸出如下:

9-1:

hanhan
Chinese food
The Chinese food restaurant named hanhan is open.

9-2:

a
Chinese food
The Chinese food restaurant named a is open.

9-3:

first name:goudan
last_name:li
sex:man
Hello,Li Goudan!

二、使用類和屬性

與函數部分類似,不再贅述。

動手試一試9-4 — 9-5

#9-4

print("\n9-4:\n")

class Restaurant():

    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number = 0

    def describe_restaurant(self):
        print(self.restaurant_name)
        print(self.cuisine_type)

    def open_restaurant(self):
        print("The "+self.cuisine_type+" restaurant named "+self.restaurant_name+" is open.")

    def number_served(self):
        print("This restaurant has "+str(self.number)+" people.")

    def set_number_served(self, number):
        self.number = number

    def increase_number_served(self,num):
        self.number += num


hanhan_restaurant = Restaurant('hanhan', 'Chinese food')
hanhan_restaurant.number_served()
hanhan_restaurant.number = 5
hanhan_restaurant.number_served()

hanhan_restaurant.set_number_served(10)
hanhan_restaurant.number_served()

hanhan_restaurant.increase_number_served(5)
hanhan_restaurant.number_served()


#9-5

print("\n9-5:\n")

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex
        self.login_attempts = 0

    def describe_user(self):
        print("first name:"+self.first_name)
        print("last_name:"+self.last_name)
        print("sex:"+self.sex)

    def greet_user(self):
        print("Hello,"+self.last_name.title()+" "+self.first_name.title()+"!")

    def increment_login_attempts(self):
        self.login_attempts += 1

    def reset_login_attempts(self):
        self.login_attempts = 0

a_user = User('goudan','li','man')
print(a_user.login_attempts)
a_user.increment_login_attempts()
a_user.increment_login_attempts()
print(a_user.login_attempts)
a_user.reset_login_attempts()
print(a_user.login_attempts)

輸出如下:

9-4:

This restaurant has 0 people.
This restaurant has 5 people.
This restaurant has 10 people.
This restaurant has 15 people.

9-5:

0
2
0

三、繼承

編寫類時,並非總是要從空白開始。如果你要編寫的類是另一個現成類的特殊版本,可使用繼承 。一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的 類稱爲父類,而新類稱爲子類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。

1.子類的方法_init_()

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)+" mlies on it.")

    def update_odometer(self,mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        self.odometer_reading += miles


class ElectricCar(Car):

    def __init__(self,make,model,year):
        super().__init__(make,model,year)

my_telsa = ElectricCar('telsa','model s',2016)
print(my_telsa.get_descriptive_name())

上述代碼創建了一個新類電動汽車,繼承了類汽車的內容.

super() 是一個特殊函數,幫助Python將父類和子類關聯起來。這行代碼讓Python調用ElectricCar 的父類的方法__init__() ,讓ElectricCar 實例包含父類的所 有屬性。父類也稱爲超類(superclass),名稱super因此而得名。

2.添加特有屬性

class Car():
xxx

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_telsa = ElectricCar('telsa','model s',2016)
print(my_telsa.get_descriptive_name())
my_telsa.describe_battery()

3.重寫父類的方法

只需在子類中定義一個方法,與想要修改的父類方法名稱一致即可。

4.將實例用作屬性

與繼承類似。

class Car():
xxx

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_telsa = ElectricCar('telsa','model s',2016)

print(my_telsa.get_descriptive_name())
my_telsa.battery.describe_battery()

動手試一試 9-6 — 9-9


# 9-6

print("\n9-6:\n")

class Restaurant():

    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        print(self.restaurant_name)
        print(self.cuisine_type)

    def open_restaurant(self):
        print("The "+self.cuisine_type+" restaurant named "+self.restaurant_name+" is open.")


class IceCreamStand(Restaurant):

    def __init__(self,restaurant_name,cuisine_type):
        super().__init__(restaurant_name,cuisine_type)
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_icecream(self):
        flavours = ['milk','chocolate','sugar']
        print("We have the following tastes:\n"+str(flavours))

ice = IceCreamStand('hanhan','Chinese')
ice.open_restaurant()
ice.describe_icecream()


# 9-7
print("\n9-7:\n")

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex
        self.login_attempts = 0

    def describe_user(self):
        print("first name:"+self.first_name)
        print("last_name:"+self.last_name)
        print("sex:"+self.sex)

    def greet_user(self):
        print("Hello,"+self.last_name.title()+" "+self.first_name.title()+"!")

    def increment_login_attempts(self):
        self.login_attempts += 1

    def reset_login_attempts(self):
        self.login_attempts = 0

class Admin(User):

    def __init__(self,first_name,last_name,sex):
        super().__init__(first_name,last_name,sex)
        self.first_name = first_name
        self.last_name = last_name

    def show_privileges(self):
        string = ["can add post","can delete post","can ban user"]
        print("User's power:\n"+str(string))

goudan = Admin('goudan','li','man')
goudan.show_privileges()


#9-8

print("\n9-8:\n")

class Privileges():

    def __init__(self,list=["can add post","can delete post","can ban user"]):
        self.list = list

    def show_privileges(self):
        print(self.list)

class Admin(User):

    def __init__(self,first_name,last_name,sex):
        super().__init__(first_name,last_name,sex)
        self.first_name = first_name
        self.last_name = last_name
        self.privilege = Privileges()

goudandan = Admin('goudandan','li','man')
goudandan.privilege.show_privileges()


#9-9

print("\n9-9:\n")

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)+" mlies on it.")

    def update_odometer(self,mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        self.odometer_reading += miles

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.")

    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 += " miles on a full charge."
        print(message)

    def upgrade_battery(self):
        if self.battery_size != 85:
            self.battery_size = 85
        else:
            self.battery_size = self.battery_size

class ElectricCar(Car):

    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery = Battery()



xiaoniao = ElectricCar('telsa','model s',2016)
print(xiaoniao.get_descriptive_name())
xiaoniao.battery.describe_battery()
xiaoniao.battery.get_range()
xiaoniao.battery.upgrade_battery()
xiaoniao.battery.describe_battery()
xiaoniao.battery.get_range()

輸出如下:

9-6:

The Chinese restaurant named hanhan is open.
We have the following tastes:
['milk', 'chocolate', 'sugar']

9-7:

User's power:
['can add post', 'can delete post', 'can ban user']

9-8:

['can add post', 'can delete post', 'can ban user']

9-9:

2016 Telsa Model S
This car has a 70 -kWh battery.
This car can go approximately 240 miles on a full charge.
This car has a 85 -kWh battery.
This car can go approximately 270 miles on a full charge.

四、導入類

同函數。

動手試一試 9-10 — 9-12

五、python標準庫

1.collections模塊中的類——OrderedDict

字典讓你能夠將信息關聯起來,但它們不記錄你添加鍵—值對的順序。要創建字典並記錄其中的鍵—值對的添加順序,可使用模塊collections 中的OrderedDict 類。OrderedDict 實例的行爲幾乎與字典相同,區別只在於記錄了鍵—值對的添加順序。

from collections import OrderedDict

favourite_languages = OrderedDict()

favourite_languages['jen'] = 'python'
favourite_languages['tom'] = 'java'

for name,language in favourite_languages.items():
    print(name)
    print(language)

輸出如下:

jen
python
tom
java

動手試一試9-13 9-14

9-13#9-14

print("\n9-14:\n")

from random import randint

class Die():

    def __init__(self,sides=6):
        self.sides = sides

    def roll_die(self):
        print(randint(1,self.sides))

dice_6 = Die()
dice_10 = Die(10)
dice_20 = Die(20)

print("The dice which has 6 sides:")
for i in range(10):
    dice_6.roll_die()

print("\nThe dice which has 10 sides:")
for i in range(10):
    dice_10.roll_die()

print("\nThe dice which has 20 sides:")
for i in range(10):
    dice_20.roll_die()

輸出如下:

9-14:

The dice which has 6 sides:
3
3
5
5
3
1
5
6
3
1

The dice which has 10 sides:
2
7
8
6
2
10
7
2
8
1

The dice which has 20 sides:
17
16
12
4
13
12
8
4
17
6
發佈了8 篇原創文章 · 獲贊 0 · 訪問量 448
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章