在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模块整个导入,通过模块名直接访问。