Python对象的命名和私有化

news/2024/7/16 5:36:20

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


http://www.niftyadmin.cn/n/2015587.html

相关文章

在Jmeter中使用自定义编写的Java测试代码

分类&#xff1a; 测试工具 2007-01-19 15:02 8204人阅读 评论(3) 收藏 举报 测试javaloadrunner编译器importtemplates我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser",&…

Phtots框架简介

2019独角兽企业重金招聘Python工程师标准>>> Reference: http://www.jianshu.com/p/cc85282fac5e Phtots框架: 1.PHAsset:包含具体的每个照片的资源信息. 看看些常用的 api (1).资源的原信息. mediaType:PHAssetMediaType类型的枚举值:PHAssetMediaTypeUnknown 不知…

什么是零代码开发平台,为什么企业IT应该重视?

文/明道云创始人任向晖 零代码软件开发并非一个全新的概念。早在1992年&#xff0c;最早的零代码企业软件构建工具就出现在了微软的Office套件中&#xff0c;很多企业极客都记得那个叫做Access的数据库应用。只不过&#xff0c;当年的Access只是一个单机版的应用&#xff0c;数…

Python居然可以定义两个同名通参数的函数

一个意外的场景&#xff0c;我发现Python模块中是可以定义相同的名称和参数的函数的&#xff0c;虽然在eclipse中报错了&#xff0c;但是执行时没有问题的&#xff0c;这个是IDE的问题。 其中的含义是因为第一个函数原本由test指向&#xff0c;然后解释器解析到第二个test函数时…

课程第九天内容《基础交换九》 补充内容

2019独角兽企业重金招聘Python工程师标准>>> 程回顾&#xff1a;For 人民币 时间点 项目前期 项目中期 项目后期 console - …

2020年SaaS行业正在浮现的七大趋势

文/明道云创始人 任向晖 每个行业&#xff0c;在萌发后的一到两年&#xff0c;总会风起云涌&#xff0c;三到五年&#xff0c;总会一波三折&#xff0c;五年之后&#xff0c;总有人会峰回路转。Gartner用技术曲线描摹了这个规律。2019年大约是SaaS行业的分水岭。强者继续留在舞…

PyCharm中使用Jupyter NoteBook

在PyCharm中可以使用Jupyter NoteBook&#xff0c;我觉得这个是非常的方便&#xff0c;下面就是使用方式。首先&#xff0c;你肯定得有Anaconda&#xff0c;并且开启Jupyter NoteBook服务了&#xff0c;记下token。然后创建一个notebook。3.再是写入点代码&#xff0c;执行&…

歡迎下載 高煥堂的22個視頻(免費)

高煥堂的22個視頻(免費)欢迎报名参加&#xff1a;ADT架构设计方法与技术 课程【保证学会】学员免费赠送<ADT钻石VIP卡>&#xff0c;价值6,900元&#xff0c;永续学习目录&#xff1a;(视频格式&#xff1a;mp4)视频(1)&#xff1a;抽象的迷思_父类(Superclass)不是抽象出…