成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python 包、模塊、類的管理方案優(yōu)化

luqiuwen / 1485人閱讀

摘要:需要解決的問題在編寫代碼的過程中,為了更好的管理代碼,我們會使用到包模塊類函數(shù)。所以用把里的成員,加入這是一個包內部的函數(shù)最終就可以實現(xiàn)我們前面所期望的導入方式了。

需要解決的問題

在編寫Python代碼的過程中,為了更好的管理代碼,我們會使用到包(package)、模塊(module)、類(class)、函數(shù)(function)。
介紹一下這幾個概念:

首先是模塊,module可以簡單理解為就是一個.py文件,這個文件里面可以包含類、變量、常量和函數(shù)等;

然后是包,簡單理解含有__init__.py的目錄就算是一個包,需要明確的是在python中包其實是一種特殊的模塊,但模塊并不是包。原因其實很簡單,sys.modules我們獲取到的結果中包含包和模塊,而module.__package__則會獲取到包的信息;

最后是類(函數(shù)在這里就不說了),類會寫在.py文件中,一般為了控制文件的大小,通常將一個或幾個有關聯(lián)的類寫在一個文件中。當然個人還是覺得一個類獨占一個文件比較好,除非你想看見一大堆亂糟糟的代碼擠在一個超大的文件里。

然后再來看看我們日常使用包、模塊和類的做法

# 目錄結構
#|--demo.py
#|--package_a
#   |--__init__.py
#   |--class_a.py  類ClassA
#   |--class_b.py  類ClassB

# ./demo.py

# 導入方式一
from package_a.class_a import ClassA
from package_a.class_a import ClassB
a = ClassA()
b = ClassB()

# 導入方式二
import package_a.class_a as ca
import package_a.class_b as cb
a = ca.ClassA()
b = cb.ClassB()

好的,我們的問題來了,怎么樣才能減少我們導入部分的代碼呢?或者說怎么樣才能使得一些相關聯(lián)的模塊不需要一個一個的進行導入呢?最終實現(xiàn)到下面的樣子是不是會更好

# ./demo.py

from package_a import *
a = ClassA()
b = ClassB()
解決的方法
# ./common.py
import sys

_packet_ = {}
# 裝飾器,func是類或者函數(shù)
def export(func):
    module = sys.modules[func.__module__]        # 獲取func的模塊對象
    package = sys.modules[module.__package__]    # 由模塊對象得到包對象
    package.__dict__[func.__name__] = func       # 把func添加到包的__dict__里
    # 生成所有使用該解決方案的包的__all__變量,并把導出的func添加進去
    if not package.__name__ in _packet_:
        _packet_[package.__name__] = []
    _packet_[package.__name__].append(func.__name__)
    # 原封不動地把func返回
    return func

# 在包的__init__.py里用于獲取__all__
def packet(name):
    if not name in _packet_:
        _packet_[name] = []
    return _packet_[name]
實際使用
# 目錄結構
#|--common.py(就是上面的裝飾器文件)
#|--demo.py
#|--package_a
#   |--__init__.py
#   |--class_a.py  類ClassA
#   |--class_b.py  類ClassB

首先在模塊中處理我們創(chuàng)建的類

# ./package_a/class_a.py

import common

# 使用export裝飾器,裝飾要導出的類或函數(shù)
@common.export
class ClassB(object):
    def __init__(self):
        print "This is ClassB."

然后在包的__init__.py中修改包自身

# ./package_a/__init__.py

import common

# 注意,這步很重要?。。雽⒁獙С龅淖幽K,需要具體模塊名字,此處import * 不可用
from . import class_a, class_b

# 用packet初始化包的__all__,主要是用于支持 "from . import *" 導入
__all__ = common.packet(__name__)

# 因為用__all__會影響"from . import *"。所以用export把__init__.py里的成員,加入__all__
@common.export
def pafunc():
    """ 這是一個包內部的函數(shù) """
    print("pafunc")

最終就可以實現(xiàn)我們前面所期望的導入方式了。

# ./demo.py

from package_a import *
a = ClassA()

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/41703.html

相關文章

  • Python-爬蟲工程師-面試總結

    摘要:內存池機制提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統(tǒng)。為了加速的執(zhí)行效率,引入了一個內存池機制,用于管理對小塊內存的申請和釋放。 注:答案一般在網上都能夠找到。1.對if __name__ == main的理解陳述2.python是如何進行內存管理的?3.請寫出一段Python代碼實現(xiàn)刪除一個list里面的重復元素4.Python里面如何拷貝一個對象?...

    antz 評論0 收藏0
  • 宜信開源|數(shù)據庫審核軟件Themis部署攻略

    摘要:一介紹是宜信公司團隊開發(fā)的一款數(shù)據庫審核產品,可幫助開發(fā)人員快速發(fā)現(xiàn)數(shù)據庫質量問題,提升工作效率。此平臺可實現(xiàn)對數(shù)據庫進行多維度對象結構文本執(zhí)行計劃及執(zhí)行特征的審核,用以評估對象結構設計質量及運行效率。執(zhí)行計劃指數(shù)據庫中的執(zhí)行計劃。 一、介紹 Themis是宜信公司DBA團隊開發(fā)的一款數(shù)據庫審核產品,可幫助DBA、開發(fā)人員快速發(fā)現(xiàn)數(shù)據庫質量問題,提升工作效率。其名稱源自希臘神話中的正義...

    fsmStudy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<