首先先明确一点, python 不能真正的对属性(和方法)进行私有, 因为 python 没有想 java 那样的private
可用.
python 提供的"私有", 是为了怕在编程的过程中对对象属性不小心"误伤"提供的一种保护机制! 这种级别的私有稍微只要知道了规则, 是很容易访问到所谓的私有属性或方法的.
为什么需要私有
封装和保护数据的需要.
默认情况下, 类的所有属性和方法都是公共的, 也就意味着对他们的访问没有做任何的限制.
意味着, 在基类中定义的所有内容都可以都会被派生类继承, 并可从派生类内部进行访问.
在面向对象的应用程序设计中, 我们通常不希望这种行为, 因为他们暴露基类的内部实现, 可能导致派生类中的使用的私有名称与基类中使用的相同的私有名称发生冲突.
属性或方法私有后就可以避免这种问题!
"私有"机制
为了解决前面说的问题, python 提供了一种叫做名称改写(name mangling)的机制
如果给属性或者方法命名的时候, 使用两个下划线开头(__
)的属性和方法名会自动变形为_类名__方法名
, 这样就避免了在基础中命名冲突的问题.
class Student:
def __init__(self):
pass
def __say(self):
print("我是私有方法你信吗?")
s = Student()
s.__say() # 双下划线开头的方法已经被形变, 此处访问不到
s._Student__say()
不是真正的私有
尽管这种方案隐藏了数据, 但是并没有提供严格的机制来限制对私有属性和方法的访问.
虽然这种机制好像多了一层处理, 但是这种变形是发生在类的定义期间, 并不会在方法执行期间发生, 所以并没有添加额外的开销.
不同的声音
有部分人认为这种使用双__
的机制好辣鸡, 写两个下划线影响效率. 他们使用一个下划线, 并把这个作为一个约定.
好吧, 你喜欢哪种呢?