python模块名 对象名_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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值