Python对象的命名和私有化

本文详细解释了Python中私有变量的使用方法,包括单下划线和双下划线变量的区别,以及如何在类内外访问这些变量。通过具体实例展示了Python如何处理变量的名称重整以避免子类冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### Python 对象命名规范 在 Python 编程中,遵循一致的命名约定对于提高代码可读性维护性至关重要。根据 PEP 8 编码风格指南[^2],以下是主要的对象命名规则: #### 类名 类名应采用 `CapWords` 或者称为 `PascalCase` 的形式,即每个单词首字母大写且不使用下划线分隔。 ```python class MyClass: pass ``` #### 函数变量名 函数名、方法名以及局部变量应该全部小写,如果由多个词组成,则用下划线连接各个词语。 ```python def my_function(): user_input = "example" ``` #### 私有成员 当希望某些属性仅限于类内部访问时,在名称前加上双下划线 (`__`) 将触发名称改写的机制[^1]。这并不是严格的私有化实现,而是通过改变名字的形式使得外部直接引用变得困难。 ```python class ExampleClass: def __init__(self): self.__private_var = None def get_private(self): return self.__private_var ``` 注意:虽然可以在技术上绕过这种保护机制并访问这些所谓的“私有”成员,但这违背了设计意图,并可能导致不可预见的行为。 #### 特殊方法与属性 特殊的方法或属性通常以两个下划线开头并且也以两个下划线结尾,这类标识符用于表示特定的操作或是内置功能接口的一部分。 ```python class SpecialMethodsExample: def __init__(self): # 构造器 ... def __str__(self): # 字符串表达式转换 ... ``` 以上就是关于 Python 中不同类型的对象应该如何正确命名的一些指导原则。保持良好的命名习惯不仅有助于个人项目的清晰度,也能让团队协作更加顺畅高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值