没怎么学过Java,不过在Java中很容易就能看到各种私有变量。Python中有吗?
有的呢,下面就是变量是否为私有的区别:
xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
- __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
- xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己构建这样的名字!
- xx_:单后置下划线,用于避免与Python关键词的冲突(通常是自己不知道该怎么去名字的时候到了/坏笑)
如下:
#coding=utf-8
class Person(object):
def __init__(self, name, age, taste):
self.name = name
self._age = age
self.__taste = taste
def showperson(self):
print(self.name)
print(self._age)
print(self.__taste)
def dowork(self):
self._work()
self.__away()
def _work(self):
print('my _work')
def __away(self):
print('my __away')
比如我现在可以从实例化对象中访问showperson,dowork,_work 三个方法。
但是不能访问_away_方法。
>>> a.__way()
>>>
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-32-484625135d8c> in <module>()
----> 1 a.__way()
AttributeError: 'Person' object has no attribute '__way'
>>> a._Person__away()
my __away
# 虽然为私有方法,但最终还是能够访问。
因为它是通过name mangling名字重整来实现的(目的就是以防子类意外重写基类的方法或者属性)
既然这样,当然我们可以通过更改名字就能访问了。
可以使用Class._dir_来查看重整后的名字。
如:_Class__object)机制就可以访问private了。
Conclusion:
父类中属性名为__名字的,子类不继承,子类不能访问
如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
- _名的变量、函数、类在使用from xxx import *时都不会被导入