保护对象的属性
如果有一个对象,当需要对其进行修改属性时,有2种方法
- 对象名.属性名 = 数据 ---->直接修改
- 对象名.方法名() ---->间接修改
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
- 将属性定义为私有属性
- 添加一个可以调用的方法,供调用
class People(object):
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def setName(self, newName):
if len(newName) >= 5:
self.__name = newName
else:
print("error:名字长度需要大于或者等于5")
xiaoming = People("dongGe")
print(xiaoming.__name)
class People(object):
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def setName(self, newName):
if len(newName) >= 5:
self.__name = newName
else:
print("error:名字长度需要大于或者等于5")
xiaoming = People("dongGe")
xiaoming.setName("wanger")
print(xiaoming.getName())
xiaoming.setName("lisi")
print(xiaoming.getName())
总结
- Python中没有像C++中public和private这些关键字来区别公有属性和私有属性
- Python通过在属性/方法前加下划线来区分
面试题
- python中单下划线和双下划线的区别?
1. __方法名__ # 内建方法,用户不要这样定义,例如__init__和__del__
2. __变量名 # 全私有/全保护变量,也叫私有成员,只有类对象自己能访问,连子类对象也不能访问到这个数据
3. _变量名 # 半保护变量,只有类对象和子类对象自己能访问到这些变量
虽然从意义上讲单下划线和双下划线的变量都属于私有(受保护)变量,理论上外界不能访问,但python没有那么严格,仍然可以强行访问.
class Car():
def __init__(self, color, brand):
self._color = color
self.__brand = brand
car = Car("黑色", "宝马")
print(car._color)
print(car._Car__brand)
因此python的私有仅仅是意义上的私有,只是种规范,可以不遵守.
为什么类A有个名为_A__private的 属性呢?而且__private消失了!这就要谈谈Python的私有变量“矫直”了。
Python把以两个或以上下划线字符开头且没有以两个或以上下划线结尾的变量当作私有变量。私有变量会在代码生成之前被转换为长格式(变为公有)。转换机制是这样的:在变量前端插入类名,再在前端加入一个下划线字符。这就是所谓的私有变量矫直(Private name mangling)。如类 A里的__private标识符将被转换为_A__private,这就是上一节出现_A__private和__private消失的原因了。