《Python編程從入門到實踐》_第九章_類


創建一個簡單的類

根據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、 nameage。在這個方法的定義中,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 *    #導入所有的類

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM