python 中自定義函數類的引用,主要分為以下幾種情況進行討論。
1. 在同一個文件夾下
對於同一文件夾下的py 文件來說,按理來說,其實可以直接正常import使用的,如下面的這種情況,dissim_get.py 文件 和lightfm_reco.py 文件,想要在lightfm_reco.py文件中引用dissim_get.py , 其實可以直接通過下面的方法進行引用:
import dissim_get #或者 from dissim_get import *
如果不能,則只能夠將dissim_get.py 文件所在的文件夾的路徑引入到python的搜索路徑中即可,在這里只需要將文件夾lightfm_init的路徑導入即可。
import sys sys.path.append('py文件所在父目錄')
或者還可以直接采用下面這一種方式
from . import dissim_get
如果要引用改dissim_get.py文件下的其他的內容,則可以使用下面的語句來實現:
from .dissim_get import get_euclidean_result , get_cosine_result ,get_pearsonr_result
2. 不在同一文件夾中
不在同一文件夾中可以分為以下兩種情況:
針對於這兩種情況,可以采用下面的方式 , 但是並不是所有時候都管用
import sys sys.path.append('相應的路徑')
針對於第一種情況,還可以使用下面方法:
from ..Handledata.input_handle import get_lr_input_data
針對於 第二種情況 還可以使用 以下方法:
# 針對於不同文件下的 第二種情況,要引用的py文件在另外的一個python package里面 from src import Handeldata # 或者要引用具體的函數 則 使用 from src.Handledata.sampling_random import sampling_data # 公式為 : from 不平行的另外一個python package import 函數類
3.總結
從上面的幾種方法來看 , 引用自定義的函數類 的時候和引用官方函數類的方法是一致的,但是在運行的時候可能不能夠使用的原因在於,並沒有找到自定義函數類的路徑,因此在from 或者 import 自定義函數類的時候則需要 確定一下路徑:
3. 1 針對於同一個文件夾下的py文件
# "." 表示當前路徑下的同級文件 from . import 函數類名
3.2 針對於不同文件夾下(但是屬於同一個大的python package下)
也即 存在於平行python package下時
# ".." 回到了上級目錄 並引用該目錄下的A模塊 from ..A import 要引用的函數類
3.3 存在於同一項目下,兩個大的python package下,也即上面所示3圖的情況
針對於這一種情況,則直接引用 大的python package 即可
from src import 所需函數類
4. python 中實現打包自己的代碼
如何將寫好的python模塊,進行封裝,最后變成直接供別人調用的模塊呢 ???
封裝也即意味着其他的用戶並不能夠直接查看到模塊的具體的實現過程、方法、屬性等等, 且封裝面向對象的三大特性之一, 因此如何進行有效的封裝呢? 下面舉個例子來實現:
首先建立一個python package —— example , 並在其下建立test.py 文件,具體代碼如下:
def run(): print ('This is a run package!') if __name__ == '__main__': run()
需要注意的是,此時在example 包下有兩個文件,其一 test.py文件 ,其二 __init__.py 文件 。 要想進行封裝引用還需要在example包的同目錄下建立setup.py文件,其代碼具體如下:
from setuptools import find_packages,setup setup( name = 'test0', version = '0.1', packages = find_packages(), )
其中: name = 自己建立的py文件名
完成上面的步驟之后,打開Anaconda Prompt / cmd ,並將目錄cd到所在模塊的路徑即可進行安裝:
然后使用如下的命令來完成模塊的安裝即可,安裝之后在看該目錄下的tree結構如下圖
python setup.py install
上面的步驟已經完成了python自建模塊的封裝, 想要進行打包成zip 則只需執行;
python setup.py sdist
5. 注意
有的時候出現不管用的情況,其可能因為在建立python模塊下沒有__init__.py文件,這樣是因為在建立python - module 的時候直接按照正常的文件夾directory來建立了,而沒有選擇python package , 此時改相應的文件夾下面就沒有__init__.py文件 。
還有一種可能引用不成功的情況是,在即使有了__init__.py文件還是不能夠引用成功,此時則在被引用的python包下的__init__.py文件中通過語句將所要引用的函數類進行說明:
__all__=['函數類名‘]
好了 ,大致就是這樣,終於over !! !