电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何理解Python中包的引入

瀏覽:101日期:2022-07-24 08:28:40

Python的from import *和from import *,它們的功能都是將包引入使用,但是它們是怎么執行的以及為什么使用這種語法呢?

從一模塊導入全部功能

from import * means意味著“我希望能訪問中我有權限訪問的全部名稱”。例如以下代碼something.py:

# something.pypublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

在Python解釋器中,我們可以執行from something import *,然后看到如下的內容:

>>> from something import *>>> public_variable42>>> _private_variable...NameError: name ’_private_variable’ is not defined>>> public_function()'I’m a public function! yay!'>>> _private_function()...NameError: name ’_private_function’ is not defined>>> c = PublicClass()>>> c<something.publicclass object='' at='' ...=''>>>> c = _WeirdClass()...NameError: name ’_WeirdClass’ is not defined

from something import *從something中導入了除了以_開頭名稱外的其他所有名稱,按照規范,_開始的名稱是私有的所以未被導入。

上面沒提到__all__是什么。__all__是一個字符串列表,指定了當from import *被使用時,模塊(或者如后文會提到的包)中的哪些符號會被導出。如果我們不定義__all__(我們在上面的something.py就沒定義),import *默認的導入方式是導入除了下劃線(_)開頭的所有名稱。再說一次,編程慣例上下劃線表示一個符號是私有的,不導入是合理的。讓我們來看看在something.py中定義我們自己的__all__會發生什么。

# something.py__all__ = [’_private_variable’, ’PublicClass’]# The rest is the same as beforepublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

現在,我們期望from something import *只會導入_private_variable和PublicClass:

# something.py__all__ = [’_private_variable’, ’PublicClass’]# The rest is the same as beforepublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

包是怎樣的呢?

當從一個包中導入全部時,__all__的做法和模塊基本一樣,不過它處理的是包中的模塊(而不是把模塊中的名都導入)。所以當我們使用from import *.時__all__說明了所有需要被導入當前命名空間的模塊。

不同之處在于,如果你在一個包的__init__.py里面沒有聲明__all__,from import *語句不會導入任何東西(這個說法也不全對,正確的說法在此)

但是,這有什么不好?

繼續讀之前,在你的Python解釋器中,執行import this,再讀一遍Python之禪(在你孩子每晚睡前也要讀給他們)。

明確比含糊要好。

from import * 是不明確的。它沒告訴我們我們正在導入什么或者我們把什么帶入當前命名空間了。更好的做法是顯式地導入我們需要的全部名稱。這種方式下,讀者(非常可能是未來的你自己)就不會困惑于你代碼中使用的一個變量/方法/類/其他東西是哪兒來的,這也告訴了我們下一點:

可讀性很重要

即使你需要導入很多東西,一個一個顯式地導入也更清楚。使用PEP 328:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END)

你現在就能明確知道你的命名空間里有什么,使用ctrl+f能很快地告訴你它們是哪兒來的。

同時,你還總是要承擔模塊/包作者更改list內容(加/減東西)的風險。

內容擴展:

基本注意點

模塊:一般指一個py文件;包:含有許多py文件的文件夾,含有 或不含有(Python3中允許)__init__文件。 凡是在導入時帶點的,點的左邊都必須是一個包 (import a.fun1 其中a為py文件)這種導入形式是錯誤的。 2.from a import fun1 a為一個py文件,fun1為該文件的屬性或方法,這種導入形式是可以的。 一般來說 import 后面不能帶點,如:(from a import b.c是錯誤語法) 導入模塊時,是將模塊的py文件導入進去(執行);導入包時,只會執行包中的__init__文件中的代碼,故導入包時一般要導入到最底層,即from dir1.dir2.dir3 import py文件或者類、方法、屬性,只有這樣才能找到。但是你可以通過先導入一個包,然后在包的文件中的__init__中寫相關的import語句(可以絕對,也可以相對),這樣也可以通過import 包名 的方式將包中的東西導入進去。

以上就是如何理解Python中包的引入的詳細內容,更多關于Python中包的引入詳解的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 电力电子产业网 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 上海道勤塑化有限公司 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 胃口福饺子加盟官网_新鲜现包饺子云吞加盟 - 【胃口福唯一官网】 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 压力变送器-上海武锐自动化设备有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | CNC机加工-数控加工-精密零件加工-ISO认证厂家-鑫创盟 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 汝成内控-行政事业单位内部控制管理服务商 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 包头市鑫枫装饰有限公司| 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 |