公有还是私有?一文搞懂奇怪的python变量
很多童靴刚开始接触python变量的时候应该会非常困惑,因为python中的变量实在是太灵活了,而且变量的写法也是很独特,相同的字符,前面或者后面加单下划线或者双下划线都可以组成不同的变量名称。
极度灵活的python变量
python中的变量一般是字母、数字、下划线组成, 但是 变量不能以数字开头,而且变量区分大小写!!!
python中的常量一般是大写字母表示。
在Python中,有以下几种方式来定义属性变量:
- `xx`:公有变量
- `_xx`:单前置下划线,被保护的属性或方法,
- `__xx`:双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类内部本身进行访问了。连子类也不可以)。
- `__xx__`:双前后下划线,系统定义名字(这就是在python中强大的魔法方法),因为变量名__xx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
- `xx_`:单后置下划线,用于避免与Python关键词的冲突,可以直接调用。
class Car:
__name='geely' #私有属性,不可以直接调用
_age = 18 #受保护的属性,可以直接调用,但是不建议直接调用
def _get_name(self): #受保护的方法,外部还可以调用
return self.__name
def __get_age(self): #私有方法,外部不可以调用
return self.__age
def test(self):
return self._get_name()
def testb(self):
return self.__get_age()
c= Car()
c._age
18
c.__name #前置双下划线不能直接访问,会报错
AttributeError: 'Car' object has no attribute '__name'
一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用,当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全做到真正的私有,只是约定俗成的而已,这样写表示不希望这个变量在外部被直接调用。
__xx ,双下划线的私有属性,无法在外部直接访问,但是其实也不是真正的私有属性,只是python对属性名字进行重整,所以访问不到,我们可以通过__dict__属性查看重整后的属性名称
__dict__属性
在类里面,其实并没有方法这个东西,所有的东西都保存在属性里面,所谓的调用方法其实是类里面的一个同名属性指向了一个函数(方法),返回的是函数的引用,再用 函数() 这种方式就可以调用它 。
我们可以通过__dict__属性来查看,__dict__是存放对象的属性,字典类型,查找对象的属性,其实是在对象的__dict__字典中查找。
class Te:
__age=19
def hello(self):
print('hello')
通过__dict__看一下类的属性 Te.__dict__
mappingproxy({'__module__': '__main__',
'_Te__age': 19,
'hello': ,
'__dict__': ,
'__weakref__': ,
'__doc__': None})
很明显,__age被重整为 _Te__age,就是类名加原属性名称,可以通过这个属性名称访问,如果你非要通过外部访问,也是可以的,可以使用t._Te__age对__age进行访问。
Te._Te__age
>> 19
注:虽然私有变量可以通过_类名__变量名来访问,但强烈建议不要这样做