Python对象的命名和私有化

Python中常见的变量和方法等命名通常是这样的:

name:一般变量,在类中,类外都可以使用,对象直接可以访问
__name:双下划线私有变量,在类中可以访问,类外不能直接访问
_name:单下划线的变量,与双下划线有点类似也是私有变量,区别在于from 模块 import *时不能导入,类和对象能直接访问
__init__:类似这样的两边都有的双下划线的方法时系统具有特殊功能的方法,一般不要这样自定义方法,如__new__用来创建对象,__init__用来初始化对象

在同一模块中,访问如name和_name形式变量和__name变量:
class mypri(object):
    def __init__(self,name):
        self.name = name
        self.__age = 20
        self._addr = 'hz'

p = mypri('dgb')
print('name : %s , addr : %s'%(p.name,p._addr))
print('age is %d'%p.__age)

输出:
Traceback (most recent call last):
  File "D:\iStudy\Python\python\mypythonstudy\com\dgb\test\myprivate.py", line 17, in <module>
    print('age is %d'%p.__age)
AttributeError: 'mypri' object has no attribute '__age'
name : dgb , addr : hz

根据输出得知"__"变量不能直接通过对象在外部访问,不能访问的原因是Python为了避免与子类变量冲突做了名字重整形式为_ClassName__Object,而“_”变量和没有下划线变量不会名字重整,如下:
class mypri(object):
    def __init__(self,name):
        self.name = name
        self.__age = 20
        self._addr = 'hz'


p = mypri('dgb')
print('name : %s , addr : %s'%(p.name,p._addr))
print(dir(p))

输出:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_addr', '_mypri__age', 'name']

倒数第二个就已经体现了,而单下划线的变量并没有做处理。

类外再写一个模块,test.py
name = 'dgb'
_name='_dgb'
__name = '__dgb'

把test.py模块导入到别得模块中使用:
from test import *

print(name)
print(_name)

输出:
Traceback (most recent call last):
  File "D:\iStudy\Python\python\mypythonstudy\com\dgb\test\test1.py", line 10, in <module>
dgb
    print(_name)
NameError: name '_name' is not defined

但是换种方式就可以访问:
import test

print(test.name)
print(test._name)
print(test.__name)

#输出:
dgb
_dgb
__dgb

这里的区别是前者是将test中的元素全部导入到test1中,此时私有变量不允许被导入,这个与from test import name,_name,__name不同,在Python3中是可以导入的并且执行的。
from test import name,_name,__name
print(name,_name,__name)

#输出:
dgb _dgb __dgb
后者(import test)是将test模块整个导入,通过模块名直接访问。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a4eb60b07f2ac34cbe5ab92d0ab2a8dc.html