2019年8月7日(面向对象进阶)
1、面向对象编程基础
1)私有变量
———————————————————————————————————————————————————————————————
案例1:
import random
class Regist(object):
"""
Implementation resgist in 163.
"""
def account(self):
"""
Input account.
"""
# 检测邮箱的正确性.
# input 返回出来的是一个字符串
email = input('请输入邮箱:>>')
print('???? 您输入的邮箱是: %s' % email)
self.password()
def password(self):
"""
input passward,
"""
# 密码的长度必须是6-20位
# 密码必须含有大写小写字母以及数字.
for _ in range(4):
password_1 = input('请输入您的密码:>>')
password_2 = input('请输入确认密码:>>')
if password_1 == password_2:
print('密码确认成功')
self.verfily()
break
else:
print('两次密码不一致')
else:
print('您可能是一个机器人滚????')
"""
Implementation resgist in 163.
"""
def account(self):
"""
Input account.
"""
# 检测邮箱的正确性.
# input 返回出来的是一个字符串
email = input('请输入邮箱:>>')
print('???? 您输入的邮箱是: %s' % email)
self.password()
def password(self):
"""
input passward,
"""
# 密码的长度必须是6-20位
# 密码必须含有大写小写字母以及数字.
for _ in range(4):
password_1 = input('请输入您的密码:>>')
password_2 = input('请输入确认密码:>>')
if password_1 == password_2:
print('密码确认成功')
self.verfily()
break
else:
print('两次密码不一致')
else:
print('您可能是一个机器人滚????')
def verfily(self):
"""
ver...
"""
# 英文和数字的结合
# 给予一个简单的数学运算得到结果.
for _ in range(3):
number = random.randrange(1000,9999)
print('验证码是: %d'%number)
number_2 = input('输入验证码:>>')
if number == int(number_2):
print('注册成功')
break
else:
print('验证码错误')
else:
print('机器人????')
"""
ver...
"""
# 英文和数字的结合
# 给予一个简单的数学运算得到结果.
for _ in range(3):
number = random.randrange(1000,9999)
print('验证码是: %d'%number)
number_2 = input('输入验证码:>>')
if number == int(number_2):
print('注册成功')
break
else:
print('验证码错误')
else:
print('机器人????')
def main():
regist = Regist()
regist.account()
regist = Regist()
regist.account()
main()
请输入邮箱:>>123
???? 您输入的邮箱是: 123
请输入您的密码:>>123
请输入确认密码:>>123
密码确认成功
验证码是: 4674
输入验证码:>>4674
注册成功
???? 您输入的邮箱是: 123
请输入您的密码:>>123
请输入确认密码:>>123
密码确认成功
验证码是: 4674
输入验证码:>>4674
注册成功
———————————————————————————————————————————————————————————————
2、面向对象进阶
1)@property装饰器
之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。
# 使用装饰器的时候,需要注意:
# 1. 装饰器名,函数名需要一致.
# 2. property需要先声明,再写setter,顺序不能倒过来
# 3. 如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
# 4. 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.
"""
在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()
2)__slots__魔法
我们讲到这里,不知道大家是否已经意识到,Python是一门动态语言。通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。
———————————————————————————————————————————————————————————————
案例2:
#输入三个数字(私有),求三个数字的和
#尝试修改其中两个数字
#尝试修改其中两个数字
class Number(object):
def __init__(self,num1,num2,num3):
self.__num1 = num1
self.__num2 = num2
self.__num3 = num3
@property
def num1(self):
print(self.__num1)
@num1.setter
def num1(self,num):
self.__num1 = num
def SUM(self):
print(self.__num1 + self.__num2 + self.__num3)
number = Number(1,2,3)
number.num1 = 1000
number.SUM()
1005
———————————————————————————————————————————————————————————————
案例3:
#创建一个隐私空间,默认情况下只能被看
#当你输入密码正确的时候,才能被修改
class Num(object):
def __init__(self):
self._mimi = '哈哈哈'
self._mima = '123456'
@property
def mimi(self):
return self._mimi
@mimi.setter
def mimi(self,str_):
self._mimi = str_
num = Num()
print(num.mimi)
num.mimi = '啦啦'
print(num.mimi)
def __init__(self):
self._mimi = '哈哈哈'
self._mima = '123456'
@property
def mimi(self):
return self._mimi
@mimi.setter
def mimi(self,str_):
self._mimi = str_
num = Num()
print(num.mimi)
num.mimi = '啦啦'
print(num.mimi)
哈哈哈
啦啦
啦啦