判断密码强度/判断密码强弱(5)

去社区提问

简介:判断密码强弱5.0版本,将与‘密码操作’相关的方法封装成一个整体。

案例描述

很高兴又和你见面啦~

今天这节课我们一起将判断密码强度的相关方法封装成一个整体。也会接触Python编程中一个非常重要的面向对象的概念,学习类和对象的相关知识。

案例分析

Python是面向对象的语言,这句话究竟是什么含义呢?

有些同学可能回答了:‘母胎solo,对象这个东西我不太懂。’

稳住先别慌,此‘对象’非彼‘对象’~

快让我们进入今天的重点内容。

面向过程vs面向对象

常见的编程方式有面向对象和面向过程两种,我们来看一个小例子:

假如现在你想要吃午餐

选择1:制作一份蛋炒饭,按照步骤放入油,鸡蛋,米饭,配菜。万一中间步骤里加入了不喜欢吃的青椒,就只能重做一份。

选择2:点一份盖浇饭,米饭和菜都准备好了,想要吃回锅肉还是宫保鸡丁,直接选择就可以,万一选错再换一份菜就好了。

像蛋炒饭这样按照流程一步步进行操作就是面向过程的编程,盖浇饭这种‘组合式’则类似面向对象的编程方法。

面向过程是一件事‘该怎么做’,面向对象是一件事‘该让谁来做’,然后那个‘谁’就是对象,他要怎么做是他自己的事,反正最后一群对象合力能把事情做好就行了。

面向过程的编程是以程序执行过程为设计流程的编程思想;而面向对象是以事物为中心的编程思想。

类和对象

那么显然,在面向对象编程中,是一些‘对象’组合起来,各司其职,齐心协力完成目标。

那么究竟什么是对象,怎么创建不同功能的对象让它们相互配合呢?

下面我就来带你了解类与对象的知识。

首先是一个模版,它用来描述一类对象的行为和状态。

对象是类的实例。

我们可以很容易地在生活中找到例子来类比对象和类的关系。

比如动物是一个类,那么大熊猫、长颈鹿、猫、小狗就都可以看作动物类中的对象。

再例如我们把猫猫咪看作是一个类,那么橘猫、波斯猫、美短都可以看作猫这个类中的对象。

每个对象拥有自己的属性行为。例如熊猫是一个对象,它有自己的‘颜色’、‘体重’等属性,又有‘啃竹子’、’爬树‘等行为。

类就好像一个模版,通过它可以构造出无数实例对象。这些实例可能有些微小的差异,但基本都符合对应类的特征。

下面我们来学习如何定义类这个模版。

假如我们现在定义一个密码工具类,命名为PasswordTool,我们先不为这个类定义任何内容,写入pass占位:

  1. class PasswordTool:
  2. pass

接下来就能够以这个类为模版定义一个对象password_tool

  1. password_tool = PasswordTool()

现在我们就成功定义了类,并且为它实例化了一个对象。现在类是没有任何内容的,别着急,接下来我们就一起来研究如何完整定义一个类。

请你看下面这段代码:

  1. class PasswordTool:
  2. def __init__(self,password):
  3. # 类的属性
  4. self.password = password
  5. self.strenth_level = 0

我们在前面提到过,每个对象都有自己的属性和行为,例如猫咪有自己的‘毛色’、‘年龄’、‘体重’等,每个隶属于猫咪类下的实例对象都有这些属性,类中就需要有一个构造函数来为每个对象定义这些属性。

_init_()是类的构造函数,init前后各有两个英文下划线。区别于其他函数,在定义对象时会自动调用构造函数,而其他函数只有在写明调用时才会被执行。

我们要求用户输入密码,并且为密码判断安全强度,因此密码工具的每个实例化对象也应该具有这两个属性:密码、安全强度。我们再来为类定义一个对象:

代码练习:

编程区

  1. class PasswordTool:
  2. def __init__(self,password):
  3. # 类的属性
  4. self.password = password
  5. self.strenth_level = 0
  6. password_tool = PasswordTool('123')
  7. print(password_tool.password)

终端区

你可能会发现,init()方法和普通函数还有一点不同,除了构造时传递的参数外,它多出了一个self参数。在声明类的构造方法时,传入的self参数可以让构造方法在实现逻辑时,起到‘指向自己’的作用。

例如在构造时,需要指定当前密码工具的密码是’123‘,那么构造方法就通过self.password=’123’来操作‘自己’的密码,而不会指定到其他同类的密码工具中。

上面的例子中就为通过构造函数完成了一个密码工具对象的声明,现在它的属性中,密码是‘123’,安全强度为0。

除了构造方法外,在类中还可以添加一些其他的方法。例如现在我们要把与密码操作相关的功能都封装进一个类中,当然需要把判断密码安全强度的功能也加入进来。

在类中定义函数的方法和我们之前学习过的一样,当需要用到对象属性时,记得使用self.属性名来实现。

我们可以直接复制上节课的代码,增加处理密码强度的函数:

  1. class PasswordTool:
  2. '''
  3. 定义密码工具类
  4. '''
  5. def __init__(self,password):
  6. # 类的属性
  7. self.password = password
  8. self.strenth_level = 0
  9. def process_password(self):
  10. # 规则1:密码长度大于8
  11. if len(self.password) >= 8:
  12. self.strength_level += 1
  13. else:
  14. print('密码长度要求至少8位!')
  15. # 规则2:包含数字
  16. if self.check_number_exist():
  17. self.strength_level += 1
  18. else:
  19. print('密码要求包含数字!')
  20. # 规则3:包含字母
  21. if self.check_letter_exist():
  22. self.strength_level += 1
  23. else:
  24. print('密码要求包含字母!')

判断密码中是否出现数字/字母的函数也写进类中,变成类的方法:

  1. class PasswordTool:
  2. '''
  3. 定义密码工具类
  4. '''
  5. def __init__(self,password):
  6. # 类的属性
  7. self.password = password
  8. self.strenth_level = 0
  9. def process_password(self):
  10. # 规则1:密码长度大于8
  11. if len(self.password) >= 8:
  12. self.strength_level += 1
  13. else:
  14. print('密码长度要求至少8位!')
  15. # 规则2:包含数字
  16. if self.check_number_exist():
  17. self.strength_level += 1
  18. else:
  19. print('密码要求包含数字!')
  20. # 规则3:包含字母
  21. if self.check_letter_exist():
  22. self.strength_level += 1
  23. else:
  24. print('密码要求包含字母!')
  25. # 类的方法
  26. def check_number_exist(self):
  27. """
  28. 判断字符串中是否含有数字
  29. """
  30. has_number = False
  31. for c in self.password:
  32. if c.isnumeric():
  33. has_number = True
  34. break
  35. return has_number
  36. def check_letter_exist(self):
  37. """
  38. 判断字符串中是否含有字母
  39. """
  40. has_letter = False
  41. for c in self.password:
  42. if c.isalpha():
  43. has_letter = True
  44. break
  45. return has_letter

这样一来,就完成了完整密码工具类的定义。

在主函数中,给用户5次机会设置密码,用户每设置一次密码就实例化一个密码工具对象,通过调用刚才类中定义的process_password()函数得到密码强度:

  1. try_times = 5
  2. while try_times > 0:
  3. password = input('请输入密码:')
  4. # 实例化密码工具对象
  5. password_tool = PasswordTool(password)
  6. password_tool.process_password()
  7. if password_tool.strength_level == 3:
  8. print('恭喜!密码强度合格!')
  9. break
  10. else:
  11. print('密码强度不合格!')
  12. try_times -= 1
  13. if try_times <= 0:
  14. print('尝试次数过多,密码设置失败!')

别忘记把用户输入的密码及对应密码强度写入文件:

  1. try_times = 5
  2. while try_times > 0:
  3. password = input('请输入密码:')
  4. # 实例化密码工具对象
  5. password_tool = PasswordTool(password)
  6. password_tool.process_password()
  7. f = open('password_5.0.txt', 'a')
  8. f.write('密码:{}, 强度:{}\n'.format(password, password_tool.strength_level))
  9. f.close()
  10. if password_tool.strength_level == 3:
  11. print('恭喜!密码强度合格!')
  12. break
  13. else:
  14. print('密码强度不合格!')
  15. try_times -= 1
  16. if try_times <= 0:
  17. print('尝试次数过多,密码设置失败!')

下面来整体看一下今天的代码~并尝试运行结果吧。

  1. class PasswordTool:
  2. """
  3. 密码工具类
  4. """
  5. def __init__(self, password):
  6. # 类的属性
  7. self.password = password
  8. self.strength_level = 0
  9. def process_password(self):
  10. # 规则1:密码长度大于8
  11. if len(self.password) >= 8:
  12. self.strength_level += 1
  13. else:
  14. print('密码长度要求至少8位!')
  15. # 规则2:包含数字
  16. if self.check_number_exist():
  17. self.strength_level += 1
  18. else:
  19. print('密码要求包含数字!')
  20. # 规则3:包含字母
  21. if self.check_letter_exist():
  22. self.strength_level += 1
  23. else:
  24. print('密码要求包含字母!')
  25. # 类的方法
  26. def check_number_exist(self):
  27. """
  28. 判断字符串中是否含有数字
  29. """
  30. has_number = False
  31. for c in self.password:
  32. if c.isnumeric():
  33. has_number = True
  34. break
  35. return has_number
  36. def check_letter_exist(self):
  37. """
  38. 判断字符串中是否含有字母
  39. """
  40. has_letter = False
  41. for c in self.password:
  42. if c.isalpha():
  43. has_letter = True
  44. break
  45. return has_letter
  46. try_times = 5
  47. while try_times > 0:
  48. password = input('请输入密码:')
  49. # 实例化密码工具对象
  50. password_tool = PasswordTool(password)
  51. password_tool.process_password()
  52. f = open('password_5.0.txt', 'a')
  53. f.write('密码:{}, 强度:{}\n'.format(password, password_tool.strength_level))
  54. f.close()
  55. if password_tool.strength_level == 3:
  56. print('恭喜!密码强度合格!')
  57. break
  58. else:
  59. print('密码强度不合格!')
  60. try_times -= 1
  61. print()
  62. if try_times <= 0:
  63. print('尝试次数过多,密码设置失败!')

打开生成的文件:

本关总结

今天这节课我们接触了面向对象的编程方法,学习类与对象的相关知识点,下面来总结一下:

  • 面向过程vs面向对象
  • 类与对象
  • 类的定义方法
下节预告

下节课中我们将把和文件操作相关的方法封装成一个整体,继续巩固学习类和对象的相关知识,不见不散~

想要领取课程相关资料,和更多同学一起交流学习,欢迎添加班主任老师微信。

扫描二维码添加班主任老师微信

判断密码强度 1/3

判断密码强弱(5)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时