本篇主要为Python中类的私有属性内容。
目录
场景
所有的变量都可被外部调用和修改,这样是不安全的。怎么解决呢?设置类的私有属性。
类私有属性
如果要让类的内部属性不被外部直接访问,可以通过在属性前增加两个下划线:”__属性”。
在python中如果在属性前加两个下划线,就表示这个属性变成了私有属性。
设置私有属性
对Person类增加一个money属性,然后实例化类并打印money属性。
示例如下:
class Person(object):
name = ''
age = 0
gender = 0
height = 0
weight = 0
__money = 1000
访问私有属性
示例如下:
person1 = Person()
print(person1.__money)
执行结果:
Traceback (most recent call last):
File "E:\lianxipy\day6\访问限制.py", line 12, in <module>
print(person1.__money)
AttributeError: 'Person' object has no attribute '__money'
外部已经无法访问了,提示:对象中没有这个属性。
私有属性赋值
如果我们在实例化对象后,首先给私有属性赋值,再访问就发现一个奇妙的事情:
这时候能访问私有属性了。
示例如下:
person1 = Person()
person1.__money = 10
print(person1.__money)
# 执行结果
# 10
私有属性对比
但其实我们访问的是对象设置的__money属性,并不是类的私有属性。
可通过在__init__()中打印类私有属性值与外部赋值的进行对比,发现确实如此。
示例如下:
class Person(object):
name = ''
age = 0
gender = 0
height = 0
weight = 0
__money = 1000
def __init__(self):
print(self.__money)
person1 = Person()
person1.__money = 10
print(person1.__money)
# 执行结果:
# 1000
# 10
私有属性说明
Python的类私有属性并不是真正的无法访问了,只是它把变量改变了名称,通过这种方式把私有属性隐藏起来使外部无法直接访问。
这时候可以通过”_类名__属性”的方式进行访问,不建议用这种方式直接访问,因为不同的解释器变量名称可能不同。再说本来就设置成私有属性,如果还是直接访问岂不是多此一举。
在这里只是为了了解python私有属性的特性。
示例如下:
person1 = Person()
print(person1._Person__money)
# 执行结果
# 1000
查看执行结果,已经访问到刚才设置的私有属性值。
操作私有属性
当前外部无法直接访问和设置私有属性值,
通过自定义内部的方法实现对私有属性的赋值和取值。
示例如下:
# 获取类私有属性
print(person1.get_money())
# 设置类私有属性
person1.set_money(100)
# 在获取类私有属性
print(person1.get_money())
# 执行结果
# 1000
# 100
__属性__
在python中__xxx__属于特殊变量,可以直接访问。
但是按照约定规则,请把它当做私有变量不要直接访问。
示例如下:
class Person(object):
name = ''
__age__ = 0
gender = 0
height = 0
weight = 0
__money = 1000
person1 = Person()
print(person1.__age__)
_属性
在python中_xxx变量,这样的实力变量外部可以直接访问,意为受保护的属性。
编译器中不提示类有此属性,且有受保护提示。
示例如下:
class Person(object):
name = ''
__age__ = 0
_gender = 0
height = 0
weight = 0
__money = 1000
person1 = Person()
print(person1._gender)
当打印时提示:
Access to a protected member _gender of a class
总结
本篇主要为Python中类的私有属性内容。