面向对象进阶

面向对象进阶

      在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。

@property装饰器

     之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。

# 使用装饰器的时候,需要注意:
# 1. 装饰器名,函数名需要一致.
# 2. property需要先声明,再写setter,顺序不能倒过来
# 3. 如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
# 4. 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.
例1
  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()
# person.name = '白元芳' # AttributeError: can't set attribute


if __name__ == '__main__':
main()

例2:

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('您可能是一个机器人滚😡')

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('机器人😡')

def main():
regist = Regist()
regist.account()


main()

 

posted @ 2019-08-07 16:13  依依11  阅读(109)  评论(0编辑  收藏  举报