python的namespace的理解

 
python中的名称空间是名称(标识符)到对象的映射。
具体来说,python为模块、函数、类、对象保存一个字典(__dict__),里面就是重名称到对象的映射。
-------------------------------------------------------------------------------------------
import urllib
import re
x=1 # 变量
def abc(): # 函数
pass
def qq(self): # 方法
pass
class typ(object): # 类
"""docstring for typ"""
def __init__(self, arg):
super(typ, self).__init__()
self.arg = arg
def classqq(self): # 不存在于全局变量中
pass
 
print(globals().keys()) # 打印字典中的key值
print()
print(globals()) # 打印全局变量,打印出来是以字典的形式展示
-----------------------------------------------------------------------------------------------
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'urllib', 're', 'x', 'abc', 'qq', 'typ'])
 
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000001DEC048>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\Learn\\practice\\case1.py', '__cached__': None, 'urllib': <module 'urllib' from 'D:\\Programs\\Python\\Python36\\lib\\urllib\\__init__.py'>, 're': <module 're' from 'D:\\Programs\\Python\\Python36\\lib\\re.py'>, 'x': 1, 'abc': <function abc at 0x00000000001F2E18>, 'qq': <function qq at 0x00000000021FAAE8>, 'typ': <class '__main__.typ'>}
-------------------------------------------------------------------------------------------
 
 
x=1 # 变量
def abc(): # 函数
pass
def qq(self): # 方法
pass
class Typ(object): # 类
"""docstring for typ"""
k=1 # 私有变量没有被init初始化
def __init__(self):
super(Typ, self).__init__()
self.y = 2
self.z = 3
def func(self): # 函数方法不存在于全局命名空间中
print("abcd") # 函数方法会默认return None
func.fx = 2
 
test1 = Typ()
print(Typ.__dict__)
print(test1.__dict__)
print(test1.func.__dict__)
print(globals().keys())
----------------------------------------------------------------------------------------------
{'__module__': '__main__', '__doc__': 'docstring for typ', 'k': 1, '__init__': <function Typ.__init__ at 0x00000000029007B8>, 'func': <function Typ.func at 0x0000000002900840>, '__dict__': <attribute '__dict__' of 'Typ' objects>, '__weakref__': <attribute '__weakref__' of 'Typ' objects>}
{'y': 2, 'z': 3}
{'fx': 2}
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'urllib', 're', 'x', 'abc', 'qq', 'Typ', 'test1'])
[Finished in 0.1s]
 
locals
内置函数 locals(), 返回当前函数(方法)的局部命名空间
def function(a=1):
b=2
print(locals())
return a+b
print(function())
-----------------------------
{'b': 2, 'a': 1}
3
globals
内置函数 globals(),返回当前module的命名空间
def function(a=1):
b=2
print(locals())
return a+b
print(function())
print(globals().keys())
--------------------------------------
{'b': 2, 'a': 1}
3
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'urllib', 're', 'function'])
[Finished in 0.1s]
 
locals()和globals()有一个区别是,locals只读,globals可以写
 
from module import 和 import module
  • 使用import module时,module本身被引入,但是保存它原有的命名空间,所以我们需要使用module.name这种方式访问它的 函数和变量。
  • from module import这种方式,是将其它模块的函数或者变量引到当前的命名空间中,所以就不需要使用module.name这种方式访问其它的模块的方法了。
 
 

转载于:https://www.cnblogs.com/TomBombadil/p/10979588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Namespace(命名空间)是一种在编程中用来区分各种不同命名元素的机制。它可以将不同的程序元素(变量、函数、类等)进行分组,使得它们在同一个命名空间下能够互相区分。在不同的命名空间中,可以定义具有相同名称的元素,而不会产生冲突。 快读namespace可以理解为快速了解命名空间的意思。在当前广泛使用的编程语言中,命名空间是一种非常常见的概念,如C++中的命名空间、Python中的模块和包、Java中的包等。通过快速了解命名空间,我们可以更好地进行模块化的开发,避免命名冲突,提升代码的可读性、可维护性和可重用性。 了解命名空间的重要性在于,它可以分隔不同模块之间的代码,使得每个模块可以独立开发和测试。在大型项目中,各个模块的开发往往由不同的开发人员负责,通过使用命名空间,可以避免不同模块中的命名冲突,同时也方便了代码的组织和管理。 在编程中,通过使用命名空间,我们可以更好地控制程序的作用域,避免全局变量的滥用。命名空间可以使得变量和函数的作用范围被限制在一个特定的范围内,有利于代码的结构化和模块化。 总而言之,快读命名空间是指通过了解命名空间的概念和使用方法,可以更好地进行模块化开发,提升代码的可读性和可维护性。同时,对于从事软件开发的人来说,掌握命名空间的概念也是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值