访问可见性问题
- 在python中,希望变量不要随便调用,将变量私有化
1、私有变量,变量前加“__”
2、如果非要使用私有变量,可以用dir(class())去查看它真正的名字。
3、私有变量/函数,在类内部可以直接调用
4、如果想要体现一个变量/函数特别重要可以使用“_" - 实例:
class Test:
def __init__(self,foo):
self.foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
//AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
//AttributeError: 'Test' object has no attribute '__foo'
if __name__ =="__main__":
main()
- 以上可见:python没有从语法上严格保证私有属性或方法的私密性,它只是给私有属性或方法取了一个艺名来“妨碍”对它们的访问。
- 练习:写一个邮箱注册
import random
class mailbox(object):
def __init__(self):
print("网易邮箱注册")
def name(self):
res = input("输入邮箱地址")
print("您输入的邮箱是:%s" % res)
//在类内直接调用,防止出现字条输入错误仍然继续运行下一个def的问题
self.password()
def password(self):
//for循环四次停止
for i in range(4):
self.one = input("设置密码")
self.two = input("确认密码")
if self.one == self.two:
print("设置成功")
//在break之前调用下一个要运行的def
self.yanzhengma()
break
else:
print("两次密码不一致")
else:
print('您可能是个机器人,再见')
def yanzhengma(self):
for i in range(3):
self.b = random.randrange(1000,9999)
print("验证码是:%d"%self.b)
self.checking = int(input("输入验证码"))
if self.b == self.checking:
print("验证成功")
self.tele()
break
else:
print("验证失败")
else:
print("机器人,再见")
def tele(self):
tele = input("输入手机号")
print("您输入的手机号是:%s"%tele)
//message部分未补全
def message(self):
pass
def success(self):
print("注册成功")
mailbox=mailbox()
mailbox.name()
mailbox.success()
//结果:
//网易邮箱注册
//输入邮箱地址123
//您输入的邮箱是:123
//设置密码123
//确认密码123
//设置成功
//验证码是:2493
//输入验证码2493
//验证成功
//输入手机号15587878787
//您输入的手机号是:15587878787
//注册成功
property装饰器
-
在python中,,属性和方法的访问权限只有两种,公开与私有,私有的表达方式为,给属性命名时用两个下划线作为开头;但不建议将属性设为私有,但直接将属性暴露给外界也是有问题的,比如我们没办法检查赋给属性的值是否有效。
-
默认操作:将属性命名以单下划线为开头,暗示属性是受保护的,不建议外界直接访问。
-
若要访问属性,可以通过属性的getter(访问器) 和 setter(修改器) 方法进行对应操作;
语法是: @property ,@name.setter ; 使得对属性的访问既安全又方便。
1、装饰器名,函数名需一致
2、property需要先声明,再写setter,顺序不可颠倒
3、如果你希望变量只是被访问不能被修改,那么可以使用访问器@property
4、如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器 -
实例:
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
// 访问器 - getter方法
@property
def name(self):
return self._name
//访问器 - getter方法
@property
def age(self):
return self._age
// 修改器 - setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)
def main():
person = Person('王大锤', 12)
person.play()
person.age = 22
person.play()
if __name__ == '__main__':
main()
//王大锤正在玩飞行棋.
//王大锤正在玩斗地主.
- 练习1、输入三个数字(私有),求三个数字的和,尝试更改其中两个数字
class he(object):
//定义三个变量
def __init__(self,a,b,c):
self._a=a
self._b=b
self._c=c
//访问器 - getter方法
@property
def bb(self):
return self._b
@property
def cc(self):
return self._c
//修改器 - setter方法
//@bb.setter这个命名需要与@property的def bb(self):命名一致
@bb.setter
//此处B为新命名变量赋给要运算的self._b这个值
def bb(self,B):
self._b=B
@cc.setter
def cc(self,C):
self._c=C
def SUM(self):
print(self._a+self._b+self._c)
he = he(1,2,3)
he.SUM()
//修改其中一个数字
he.bb=44
he.SUM()
//结果:
//6
//48
- 练习2、创建一个隐私空间,默认情况下只能被查看,当你输入密码正确的情况下,才能被修改
class secret(object):
def __init__(self):
self._a = "隐私空间"
//允许访问
@property
def aa(self,A):
return self._a
def mimi(self):
mima = int(input("输入:"))
if mima == 123456:
print(self._a)
else:
print("密码错误")
he = secret()
he.mimi()
//运行结果:
//输入:123456
//隐私空间
//输入:123
//密码错误
class secret(object):
def __init__(self):
self._a = "隐私空间"
def mimi(self):
mima = int(input("输入:"))
if mima == 123456:
return True
else:
return False
@property
def aa(self):
return self._a
@aa.setter
def aa(self,A):
res=self.mimi()
if res == True:
self._a = A
else:
print('ERROR')
he = secret()
he.aa = 456
he.aa
//结果:输入:123456
//456
- 在python中,类是动态的
- 实例:
class Num(object):
def __init__(self):
self.a = 1000
def A(self):
print(self.b)
num = Num()
num.b =1000000
# print(num.a)
print(num.b)
num.A()
//输出结果:
//1000000
//1000000