1. 程式人生 > >python類與對象

python類與對象

player commerce 否則 send int base 實例 nts imp

類與對象

創建類

通過關鍵字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:
    pass
p1 = 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類與對象