亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

luqiuwen / 1542人閱讀

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

需要解決的問(wèn)題

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

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

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

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

然后再來(lái)看看我們?nèi)粘J褂冒?、模塊和類的做法

# 目錄結(jié)構(gòu)
#|--demo.py
#|--package_a
#   |--__init__.py
#   |--class_a.py  類ClassA
#   |--class_b.py  類ClassB

# ./demo.py

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

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

好的,我們的問(wèn)題來(lái)了,怎么樣才能減少我們導(dǎo)入部分的代碼呢?或者說(shuō)怎么樣才能使得一些相關(guān)聯(lián)的模塊不需要一個(gè)一個(gè)的進(jìn)行導(dǎo)入呢?最終實(shí)現(xiàn)到下面的樣子是不是會(huì)更好

# ./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的模塊對(duì)象
    package = sys.modules[module.__package__]    # 由模塊對(duì)象得到包對(duì)象
    package.__dict__[func.__name__] = func       # 把func添加到包的__dict__里
    # 生成所有使用該解決方案的包的__all__變量,并把導(dǎo)出的func添加進(jìn)去
    if not package.__name__ in _packet_:
        _packet_[package.__name__] = []
    _packet_[package.__name__].append(func.__name__)
    # 原封不動(dòng)地把func返回
    return func

# 在包的__init__.py里用于獲取__all__
def packet(name):
    if not name in _packet_:
        _packet_[name] = []
    return _packet_[name]
實(shí)際使用
# 目錄結(jié)構(gòu)
#|--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裝飾器,裝飾要導(dǎo)出的類或函數(shù)
@common.export
class ClassB(object):
    def __init__(self):
        print "This is ClassB."

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

# ./package_a/__init__.py

import common

# 注意,這步很重要!!!導(dǎo)入將要導(dǎo)出的子模塊,需要具體模塊名字,此處import * 不可用
from . import class_a, class_b

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

# 因?yàn)橛胈_all__會(huì)影響"from . import *"。所以用export把__init__.py里的成員,加入__all__
@common.export
def pafunc():
    """ 這是一個(gè)包內(nèi)部的函數(shù) """
    print("pafunc")

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

# ./demo.py

from package_a import *
a = ClassA()

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41703.html

相關(guān)文章

  • Python-爬蟲工程師-面試總結(jié)

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

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

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

    fsmStudy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<