【建站服务】专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-广元上往建站-域名申请
作者: 风兰 . 阅读量: 7 . 发表时间:2022-09-21 05:37:06
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-广元上往建站

先看看官方文档的一段话:
A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。
命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。
命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。
名空间查找顺序:
假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:
NameError: name 'runoob' is not defined。
命名空间的生命周期:
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。
因此,我们无法从外部命名空间访问内部命名空间的对象。
实例
# var1 是全局名称
var1 = 5
def some_func():
# var2 是局部名称
var2 = 6
def some_inner_func():
# var3 是内嵌的局部名称
var3 = 7
如下图所示,相同的对象名称可以存在于多个命名空间中。
作用域
A scope is a textual region of a Python program where a namespace is directly accessible. "Directly accessible" here means that an unqualified reference to a name attempts to find the name in the namespace.
作用域就是一个 Python 程序可以直接访问命名空间的正文区域。
在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是:
有四种作用域:
L(Local):最内层,包含局部变量,比如一个函数/方法内部。
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
G(Global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in): 包含了内建的变量/关键字等,最后被搜索。
规则顺序: L –> E –> G –> B。
在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:
>>> import builtins
>>> dir(builtins)
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:
>>> if True:
... msg = 'I am from Runoob'
...
>>> msg
'I am from Runoob'
>>>
专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-广元上往建站
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



def intro(self): print(f'My name is {self.name},I'm {self.age}') def get_var(self): print(self.__privater_var) def set_var(self, var): self.__privater_var = varsomeone = People(name='jack', age=20)someone.intro()print(someone.age)someone.get_var() # 通过get_var方法访问私有属性__privater_var,值为10someone.set_var(30) # 通过set_var方法修改私有属性__privater_var,值为30someone.get_var() # 再次通过get_var方法访问私有属性__privater_var,值为30结果:
接下下来看看为什么我们使用someone.__privater_var会报错呢?
这里我们先使用 dir() 函数:
结果:
从打印出的结果中,我们并没有找到'_peivater_var'但是我们看到一个'_People__privater_var'.有没有想到什么?原来是被重命名了。好,我们来试试:
结果:
所以说,私有变量的属性是可以修改的。既然Python阻止访问,一般情况下就不要访问。
日日夜夜
dwl***t30@gmail.com
真心
297***2808@qq.com
上面给的 people 类定义混淆了类属性与实例属性,下面我给出自己改写的 People 定义予以证明:
# 类定义class People: name = 'nnnnnn' #这个是类属性 age = 20 #这个也是类属性 __weight = 21 #这个也是类属性,且是私有的 # 定义构造方法 def __init__(self, name, age, weight): self.name = name #这里改写的是实例属性,与类属性没有关联 self.age = age #这里改写的是实例属性,与类属性没有关联 self.__weight = weight #实例属性, 这里改写的是实例属性,与类属性没有关联 #People.__weight = weight def speak(self): print("说: 我叫 {0},{1} 岁,体重{2}斤(实例属性)" .format(self.name, self.age, self.__weight)) def speak2(self): print("私有类属性__weight = {0}".format(People.__weight))p1 = People('张三', 10, 60)p1.speak()p1.speak2()print("类属性:name={0}, age={1}".format(People.name, People.age))p2 = People('李四', 12, 69)p2.speak()p2.speak2()print("类属性:name={0}, age={1}".format(People.name, People.age))运行结果: