python類與對象
類與對象
創建類
通過關鍵字class創建一個Player類,來個栗子
class Player: pass
創建對象
通過類實例化兩個對象,來個栗子
class Player: pass p1 = Player() p2 = Player() print(p1) #<__main__.Player object at 0x00000000020E2198> print(p2) #<__main__.Player object at 0x00000000020E2E48>
添加屬性
舉個栗子
class Player: passp1 = Player() p1.name = "tom" p1.lives = 3 print(p1.name, p1.lives) #tom 3
面向對象的重點在於不同對象之間的交互
為類添加一些行為,當這些行為觸發時,可以改變對象的屬性,舉個栗子
class Player: def add_one_live(self): self.lives += 1 p = Player() p.lives = 3 p.add_one_live() print(p.lives) #4
參數self
self是對方法所調用對象的引用
類中定義的函數,其第一個形參一般都要顯示的傳入self,否則在通過類實例調用函數時會報錯
class Player: def add_one_live(): self.lives += 1 p = Player() p.add_one_live() #TypeError: add_one_live() takes 0 positional arguments but 1 was given
對象初始化
python類對象的初始化一般包含兩個部分:構造函數__new__和對象數據的初始化即初始化方法__init__,
對象的創建是通過構造函數__new__,對象數據的初始化是通過初始化函數__init__,
有的python內置類沒有__init__方法,而直接在__new__方法中創建和初始化,如Tuple。
class Player: def __init__(self, lives): self.lives = lives def add_one_live(self): self.lives += 1 p = Player(3) print(p.lives) #3 p.add_one_live() print(p.lives) #4
文檔註釋
可以在每個類、函數頭定義語句的下一行添加字符串
來個栗子
class Player: ‘Represents a player in the game‘ def __init__(self, lives): self.lives = lives def add_one_live(self): """add one live when the player passed one game checkpoint""" self.lives += 1
說明:python -i filename.py,加載這個文件到交互解釋器中
help(Player) 查看這個類的格式文檔
模塊和包
模塊
一個python文件就是一個模塊
模塊的導入
(1)導入整個模塊, 在products.py模塊需要實例化來自database.py模塊中的Database類
import database db = database.Database()
(2)導入模塊中的具體類
from database import Database db = Database()
(3)將導入的類重命名
from database import Database as DB db = DB()
(4)一次導入模塊中的多個類
from database import Database, Query
(5)禁止使用import *
from database import *
說明:如果使用,將花費更多的時間去找出類的位置,喪失某些編輯器的代碼自動補全,跳轉到自定義類位置等功能
包
一個包是一個目錄下模塊的集合,目錄的名字就是包的名字,
我們只需在目錄下添加一個名為__init__.py的文件就可以告訴python這個目錄是一個包
taobao/ main.py ecommerce/ __init__.py database.py products.py contact/ __init__.py email.py payments/ __init__.py square.py stripe.py paypal.py
來個栗子
說明:目錄中一共有3個包,在taobao這個目錄下有1個ecommerce包,在ecommerce目錄下有1個payments包和1個contact包
絕對導入
指定我們想要導入的模塊或函數的完整路徑,比如我們想要訪問products模塊中的Product類,可以用以下三種方法進行絕對導入
import ecommerce.products product = ecommerce.products.Product()
or
from ecommercek.products import Product product = Product
or
from ecommerce import products product = products.Product()
說明:這些語句可以在taobao目錄下的任何模塊中運行
如果products模塊下有10個左右的類是我需要使用的,通常使用第三種方法導入
如果products模塊下只有2個類是我需要的,通常使用第二種方法導入
相對導入
尋找與當前模塊在位置上有相對關系的類或函數,比如我們想在products模塊中導入與之相鄰的database模塊中的Database類
from .database import Database
點號表示使用當前包內的database模塊,即ecommerce包
如果我們要在paypal模塊中使用父包中的database模塊,可以用兩點號來實現
from ..database import Database
當然,我們也可以利用更多的點來導入更高層級包中的模塊,也可以一邊後退回到其他較深層
比如,我們想在paypal模塊中使用contact包下的email模塊中的send_email函數
from ..contact.email import send_email
說明:..contact.email用了兩個點號回到了payments包的上一層,然後用正常的package.module語法回到了contact包那一層
我們也可以從包中導入代碼
比如,database模塊中有一個變量db,會有從許多不同的包來訪問,import ecommerace.db顯然比import ecommerce.database.db更方便
在我們的例子中,如果ecommerce/__init__.py中包含如下一行代碼
from .database import db
那麽我們可以在main.py和其他任何文件中直接訪問ecommerce包中的db屬性
from ecommerce import db
__init__.py文件是與其他模塊通信的主要節點,但是代碼可以在內部組織為幾個不同的模塊或子包。
參考資料:《python3面向對象編程》
python類與對象