设为首页 加入收藏

TOP

Python对象的命名和私有化
2019-01-02 00:08:47 】 浏览:22
Tags: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模块整个导入,通过模块名直接访问。


 



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++流缓冲学习---rdbuf() 下一篇C语言基础教程 printf( )函数中的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }