鱼C论坛

 找回密码
 立即注册
查看: 1189|回复: 3

[已解决]GetMD5 在Manage类里面返回的None

[复制链接]
发表于 2023-5-3 16:20:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import hashlib
from time import strftime, localtime
# 3. 创建一个 Mixin 类(PasswdMixin),用于实现密码相关的功能组件(密码长度检测和将明文密码转换为 MD5 的操作)
class PasswdMixin:

    def GetMD5(self, password):
        while len(password) < 6:
            password= input('密码不能小于6位,请重新输入:')

        result = hashlib.md5(bytes(password, "utf-8"))
        self.res = result.hexdigest()
        print(self.res)
        return self.res

    def GetMD5toPassword(self, res):
        self.d = {}
        for i in range(99999999):
            bstr = bytes(str(i), "utf-8")
            s = hashlib.md5(bstr).hexdigest()
            self.d[s] = i
        return self.d[res]
# 4. 创建一个 Mixin 类(LoggerMixin),用于实现日志记录相关的功能组件
class LoggerMixin:
    print()

# 0. 这次要求大家编写一个鱼C超市会员管理系统。
# 程序功能要求如下:
# 1. 会员开卡
# 会员开卡自动赋予一个新的卡号(默认从 10000 开始递增)
# 要求输入用户名和密码
# 密码要求长度不低于 6 位
# 2. 修改密码
# 先确认输入卡号是否存在
# 再判断旧密码是否正确
# 新密码长度同样不能低于 6 位
# 3. 商品支付
# 先确认输入卡号是否存在
# 再判断密码是否正确
# 根据输入的消费金额增加会员卡积分(比如输入 250 消费金额,那么积分增加 250)
# 4. 积分查询
# 先确认输入卡号是否存在
# 再判断密码是否正确
#
#
# 代码要求:
# 1. 创建一个会员类(Member),包含信息:卡号、用户名、密码(要求密码需要以 MD5 哈希值的形式存储)、
# 积分、注册日期
class Member:
    cardid =None
    name =None
    password =None
    score =None
    datatime =None
# 2. 创建一个管理类(Manage),用于实现上方要求的主要程序功能
class Manage(PasswdMixin):
    def __init__(self):
        self.m = Member()
        self.Mumbers = {}
        self.id = 10000
        

    def GetMD5(self, password):
        super(Manage, self).GetMD5(password)

    def GetMD5toPassword(self, res):
        super(Manage, self).GetMD5toPassword(res)
    # 1. 会员开卡
    # 会员开卡自动赋予一个新的卡号(默认从 10000 开始递增)
    # 要求输入用户名和密码
    # 密码要求长度不低于 6 位
    def printMum(self):
        print(self.Mumbers)

    def createMum(self):
        self.m.cardid= self.id+1
        print(self.m.cardid in self.Mumbers)
        while self.m.cardid in self.Mumbers:
            self.m.cardid = self.m.cardid + 1
        #self.m.name=input('输入用户名')
        self.m.name = 'hcm'
        #self.m.password=input('请输入密码')
        self.m.password = '1234567'
        self.m.password= self.GetMD5(self.m.password)
        print('self.res=111111111111111111111',self.res)
        self.m.score= 0
        self.m.datatime=strftime("%Y-%m-%d %H:%M:%S")
        self.Mumbers[self.m.cardid]=[self.m.name,self.res,self.m.score,self.m.datatime]
        print('注册成功',self.m.cardid,'->',self.m.datatime)
    # 2. 修改密码
    # 先确认输入卡号是否存在
    # 再判断旧密码是否正确
    # 新密码长度同样不能低于 6 位
    def changeP(self):
        print(self.Mumbers)
        #self.uid =input('请输入UID')
        self.uid = '10001'
        if int(self.uid) in self.Mumbers:
            #self.psaaword = input('请输入现在的密码')
            self.psaaword='1234567'
            self.res= self.GetMD5(self.psaaword)
            print('self.res========', self.res)
            print('self.Mumbers[int(self.uid)][1]', self.Mumbers[int(self.uid)][1])
            if self.res == self.Mumbers[int(self.uid)][1]:
                ps = input('请输入新密码')
                psaaw = self.GetMD5(ps)
                self.Mumbers[self.uid][1]= psaaw
                print('密码修改成功!')
        else:
            print('UID不存在')


    # 3. 商品支付
    # 先确认输入卡号是否存在
    # 再判断密码是否正确
    # 根据输入的消费金额增加会员卡积分(比如输入 250 消费金额,那么积分增加 250)
    def pay(self):
        print(self.Mumbers)
        # self.uid =input('请输入UID')
        self.uid = '10001'
        if int(self.uid) in self.Mumbers:
            # self.psaaword = input('请输入现在的密码')
            self.psaaword = '1234567'
            self.res = self.GetMD5(self.psaaword)
            print('self.res=',self.res)
            print('self.Mumbers[int(self.uid)][1]',self.Mumbers[int(self.uid)][1])
            if self.res == self.Mumbers[int(self.uid)][1]:
                # self.money =input('请输入消费金额')
                self.money = int('666')
                print('self.money',self.money)
                self.Mumbers[int(self.uid)][2] = self.money
                print('商品支付完成!')
        else:
            print('UID不存在')

    # 4. 积分查询
    # 先确认输入卡号是否存在
    # 再判断密码是否正确
    def findsr(self):
        print(self.Mumbers)
        # self.uid =input('请输入UID')
        self.uid = '10001'
        if int(self.uid) in self.Mumbers:
            # self.psaaword = input('请输入现在的密码')
            self.psaaword = '1234567'
            self.res = self.GetMD5(self.psaaword)
            print('self.res=', self.res)
            print('self.Mumbers[int(self.uid)][1]', self.Mumbers[int(self.uid)][1])
            if self.res == self.Mumbers[int(self.uid)][1]:
                print(f'您的积分余额:{self.Mumbers[int(self.uid)][2]}')
        else:
            print('UID不存在')
# 3. 创建一个 Mixin 类(PasswdMixin),用于实现密码相关的功能组件(密码长度检测和将明文密码转换为 MD5 的操作)

# 4. 创建一个 Mixin 类(LoggerMixin),用于实现日志记录相关的功能组件
class LoggerMixin:
    print()

m = Manage()
m.printMum()
m.createMum()

m.printMum()
m.changeP()
m.printMum()
m.pay()
m.printMum()
m.findsr()



最佳答案
2023-5-3 16:25:28
`Manage` 类中的 `GetMD5` 方法似乎有问题,因为它返回了 None。

问题可能在于 `GetMD5` 调用了 `super()` 方法,该方法应该调用 `PasswdMixin` 类中的 `GetMD5` 方法,但实际上它并没有返回任何值。

要解决这个问题,可以修改 `PasswdMixin` 类中的 `GetMD5` 方法,将存储哈希密码值的 `result` 变量返回。然后,在 `Manage` 类中,将此结果值存储在一个变量中,并从 `Manage` 类的 `GetMD5` 方法中返回它。这样应该确保正确返回哈希密码值。

总之,您可以更改 `PasswdMixin` 中的 `GetMD5` 方法:
def GetMD5(self, password):
    while len(password) < 6:
        password = input('密码不能小于6位,请重新输入:')

    result = hashlib.md5(bytes(password, "utf-8"))
    hashed_password = result.hexdigest()
    print(hashed_password)
    return hashed_password

然后,在 `Manage` 类中,将 `GetMD5` 方法更新如下:
def GetMD5(self, password):
    hashed_password = super().GetMD5(password)
    return hashed_password
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-3 16:24:25 | 显示全部楼层
给定的代码不完整,缺少LoggerMixin的实现。此外,代码中的某些部分组织不好或不清晰。例如,在Member类中,cardid变量应该是实例变量而不是类变量。此外,PasswdMixin中的GetMD5和GetMD5toPassword方法似乎冗余且不必要。

由于代码不完整,我无法进行彻底测试。但是,我可以建议对当前代码进行一些改进:

在Member中删除类级变量cardid、name、password、score和datatime,并将它们定义为构造函数中的实例变量。

PasswdMixin类可以简化。我们可以只有一个方法get_md5,接收一个密码并返回其MD5格式的哈希值。目前的GetMD5toPassword方法是不必要的。

在Manage中,createMum可以改进,获取用户的名称和密码而不是硬编码它们。此外,密码不应该显示在屏幕上。

可以通过请求两次新密码来确认更改P方法并确保其符合长度要求。

需要实现LoggerMixin以添加日志记录功能到系统中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 16:24:45 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-3 16:25:28 | 显示全部楼层    本楼为最佳答案   
`Manage` 类中的 `GetMD5` 方法似乎有问题,因为它返回了 None。

问题可能在于 `GetMD5` 调用了 `super()` 方法,该方法应该调用 `PasswdMixin` 类中的 `GetMD5` 方法,但实际上它并没有返回任何值。

要解决这个问题,可以修改 `PasswdMixin` 类中的 `GetMD5` 方法,将存储哈希密码值的 `result` 变量返回。然后,在 `Manage` 类中,将此结果值存储在一个变量中,并从 `Manage` 类的 `GetMD5` 方法中返回它。这样应该确保正确返回哈希密码值。

总之,您可以更改 `PasswdMixin` 中的 `GetMD5` 方法:
def GetMD5(self, password):
    while len(password) < 6:
        password = input('密码不能小于6位,请重新输入:')

    result = hashlib.md5(bytes(password, "utf-8"))
    hashed_password = result.hexdigest()
    print(hashed_password)
    return hashed_password

然后,在 `Manage` 类中,将 `GetMD5` 方法更新如下:
def GetMD5(self, password):
    hashed_password = super().GetMD5(password)
    return hashed_password
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表