当前位置:首页 » 编程语言 » python私有变量

python私有变量

发布时间: 2022-11-19 16:04:29

python 私有变量问题

前者showall是在父类外面,访问父类的私有变量。当然会有错。

后者showinfo是在show函数本身里面访问这个变量,没有出show函数自己的范围。当然也不会错误。

Ⅱ pyrhon中私有变量的理解与运用

9.6. 私有变量
只能从对像内部访问的“私有”实例变量,在 Python 中不存在。然而,也有一个变通的访问用于大多数 Python 代码:以一个下划线开头的命名(例如 _spam )会被处理为 API 的非公开部分(无论它是一个函数、方法或数据成员)。它会被视为一个实现细节,无需公开。
因为有一个正当的类私有成员用途(即避免子类里定义的命名与之冲突),Python 提供了对这种结构的有限支持,称为 name mangling (命名编码) 。任何形如 __spam 的标识(前面至少两个下划线,后面至多一个),被替代为 _classname__spam ,去掉前导下划线的 classname 即当前的类名。此语法不关注标识的位置,只要求在类定义内。
名称重整是有助于子类重写方法,而不会打破组内的方法调用。例如:
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # private of original update() method
class MappingSubclass(Mapping):
def update(self, keys, values):
# provides new signature for update()
# but does not break __init__()
for item in zip(keys, values):
self.items_list.append(item)
需要注意的是编码规则设计为尽可能的避免冲突,被认作为私有的变量仍然有可能被访问或修改。在特定的场合它也是有用的,比如调试的时候。
要注意的是代码传入 exec(), eval() 时不考虑所调用的类的类名,视其为当前类,这类似于 global 语句的效应,已经按字节编译的部分也有同样的限制。这也同样作用于 getattr(), setattr() 和 delattr(),像直接引用 __dict__ 一样。

Ⅲ python 变量下划线命名规则

单下划线和双下划线在Python变量、类、模块命名中都有不懂的含义,名称中都各有其含义。有一些是程序员之间约定俗成的,Python解释器不用强制其执行,但有些Python解释器会强制执行。

本文从以下几种不同使用方式,对下划线的用途和含义进行说明:

1)变量
通常用于类内部变量的命名,表明该变量是该类私用变量,外部不要去访问它,但也是可以访问到的。这只是程序员之间的一个约定俗成的做法,Python解释器本身不会对它进行限制。
我们创建一个类:

实例化A,并访问它的变量,aa._bar 也是可以访问的,但既然人家这么命名了,外部最好不要去访问了

2)函数和模块
和变量一样,这是一个私有函数,不建议外部程序调用该函数。
我们创建一个脚本aa.py, 里面有2个函数 _aa,bb:

导入aa,分别调用函数 _aa和bb,bb 可以调用,但显示无 _aa

3)类
同变量和函数一样,都是私有变量,外部最好不要调用

用来避免和Python内置函数命名产生冲突,PEP8解释了这个约定。
如class或def不能用作Python中的变量名称,如果之间用,会提示错误。如果你非要用它,可以 使用 class_或 def_。
还有一些函数名,如chr,chr()是Python内置函数,用来表示ascii码对应的字符他的输入时数字,可以用十进制,也可以用十六进制。如果你非要它来表示染色体,可以用chr_来代替。当然如果你直接使用它作为变量名,它也不会报错,但最好不要这样使用。

在python中定义私有变量只需要在变量名或函数名前加上 "__" (两个下划线),那么这个函数或变量就会成为私有的了。

在内部,python使用一种 name mangling 技术,将__var 替换成 _classname__var,因此在外部调用__var会找不到,代替它的是_classname_var。这种处理方式叫做名称修饰(name mangling):解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。

由双下划线前缀和后缀包围的变量,不会应用名称修饰,因此不会被Python解释器修改:
我们创建一个类B,dir() 查看类的所有属性,发现 存在 __aa__

但是,Python保留了有双前导和双末尾下划线的名称,用于特殊用途。 如,__init__对象构造函数,或 __call__ 它使得一个对象可以被调用。所有我们尽量不要使用这种方式命名变量,以免和Python解释器内置的函数发生冲突。

_ 不加任何其他字符,单独作为一个名字,用来表示某个临时的或者无关紧要的变量。

举例1: 表示一个临时变量 。在下面的循环中,我们不需要获取循环的索引,只是print n 行 'Hello World',可以用 "_" 来表示它只是一个临时值:

举例2: 表示一个不关心的变量 ,仅仅是个占位符变量,用来占位。mlist 列表中,我只想获得1,2,4 位的变量,那 3 和 5 可以 用 _ 来占位

举例3 : 表示由解释器评估的最近一个表达式的结果 ,方便进行查看。

Ⅳ python 私有属性与方法

一般来说,想访问类成员变量,要么用类访问,要么用实例访问。实例访问的是实例的副本,类访问的是类的副本。
class A:
XXX = 0
def yy(self):
pass
A.XXX
或者,
a = A()
a.XXX
如果想从对象访问类的副本,可以先拿到这个实例的类,再去访问它的类成本
a.__class__.XXX
但你这个有点不一样,你这个是类的私有成员变量,外面是无法访问的(按照设计思路)。
一般稳健的方式是类的内部设置一个get()方法,调用get方法返回。
当然,如果你强行向访问,可以这样
a._A__XXX
但这种方法,访问的仍然是对象自己的副本,不是类的
如果你想强行访问,又想访问的是类自己的副本,可以这样
a.__class__._A__XXX
另外,找个好点的IDE吧,你这变量名字都拼错了

Ⅳ python问题。 编程语言

你的意思是不是指如果 foo 这个函数里的 a 变量如果获取到的是 True 的时候,要让 foo 这个函数外面的传入的变量的 b 值变成 False

如果是,那么代码如下(注意程序缩进):


a=False

b=True

def foo():

global a # 将变量提档,使用公共变量而不是私有变量

global b

if a:

b=False

return '123'

if b:

return '456'

a=True

b=True

print(foo())

print('Now B is: ' + str(b))

主要问题是公共变量与私有变量的问题。


Ⅵ python 直接访问私有变量不报错

因为你这一句 c.__radius = 7 就相当于给c添加了一个公有变量 __radius

所有就会有这种现象,如果你按下面的代码就会报错

importmath
classCircle:
def__init__(self,radius):
self.__radius=radius
defgetRadius(self):
returnself.__radius
defsetRadius(self,radius):
self.__radius=radius

c=Circle(5)
#c.__radius=7
c.setRadius(7)
c.sd=8
print(c.__radius,c.getRadius())

Ⅶ python类里的私有变量如何定义

python没有私有变量,任何定义的变量都是可以直接调用的,但是一般来说,在定义的变量前后加上两个下划线,把这样的变量当成是私有变量,如下代码所示:

classperson:
def__init__(self):
self.__private__=100
p=person()
print('__private__:',p.__private__)
print('p包含的变量:',dir(p))

输出:

__private__:100
p包含的变量:['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__le__','__lt__','__mole__','__ne__','__new__','__private__','__rece__','__rece_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__']

Ⅷ python下划线定义属性

类的私有变量和私有方法

在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性

特殊变量命名

1、 _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。

2、 __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

3、 __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)

在这里强调说一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线"_",这样的话函数或变量就变成私有的.这是python的私有变量轧压(这个翻译好拗口),英文是(private name mangling.) **情况就是当变量被标记为私有后,在变量的前端插入类名,再类名前添加一个下划线"_",即形成了_ClassName__变量名.**

Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串

__mole__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__mole__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

Ⅸ python什么是闭包 闭包的作用域

简单说,闭包就是根据不同的配置信息得到不同的结果

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical
Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法
认为闭包是由函数和与其相关的引用环境组合而成的实体。

python实例

看概念总是让人摸不着头脑,看几个python小例子就会了

def make_adder(addend):
def adder(augend):
return augend + addend
return adder

p = make_adder(23)
q = make_adder(44)

print p(100)
print q(100)

运行结果:
123
144

分析一下:

我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.

Ⅹ python类的动态方法是否可以访问到私有变量

classStudent(object):
def__init__(self,name,score):
self.__name=name;
self.__score=score;
self.__grade=3;##这是私有的属性
self.grade=3;##这是公有的。

defshow_grade(self):
print("%s__grade=%d"%(self.__name,self.__grade));
print("%sgrade=%d"%(self.__name,self.grade));


lisa=Student("lisa",88);
mona=Student("mona",82);
defset_grade(self,grade):
self.__grade=grade;##实测发现,此函数调用后__grade还是原值。__grade是私有变量。只能被class里的“静态方法”来修改。
self.grade=grade;##此函数调用后,grade的值被修改了。grade是公开变量。可以被动态方法来修改。
#print("%sgradeis%d"%(self.__name,self.grade));#在这里访问不到self.__name,所以把此句注释掉了。

Student.setGrade=set_grade;
lisa.setGrade(4);
lisa.show_grade();


结果如下:
lisa__grade=3
lisagrade=4

结论:
为类动态增加的方法,对类里私有属性没有读与写的权限。

热点内容
android文件图片 发布:2025-01-15 17:39:44 浏览:205
linux的路径怎么写 发布:2025-01-15 17:18:49 浏览:185
php解压程序 发布:2025-01-15 17:06:22 浏览:142
刷助力脚本 发布:2025-01-15 17:02:31 浏览:520
c盘里的用户文件夹可以删除 发布:2025-01-15 16:56:45 浏览:951
虚幻4编译到哪里 发布:2025-01-15 16:50:19 浏览:756
透明度渐变android 发布:2025-01-15 16:45:08 浏览:835
dos连接oracle数据库 发布:2025-01-15 16:41:39 浏览:906
网络配置比较低怎么做 发布:2025-01-15 16:35:38 浏览:362
android弹出键盘监听 发布:2025-01-15 16:35:11 浏览:208