一步步学习Python----8

这个是我们在Python基础内容讲解的末章了,下次我会更新正则表达式和测试试题,然后就完结了一步步学习Python的基础内容讲解了,大家可以看看我前面的文章投票一下之后我们是先讲Linux还是先讲数据库,持续关注给你带来更多优质文章!!

一.常见内置函数

在这里插入图片描述

'''
hasattr(qingjiao,'sex')   # 判断属性是否存在
getattr(qingjiao,'sex') = qingjiao.sex  # 得到属性值  没有就报错
setattr(qingjiao,'sex','男')   # 添加属性,属性值
delattr(qingjiao,'sex')   # 删除属性
'''

在这里插入图片描述

'''
# issubclass(HunXue,(HuNan,SiChuan))   # 判断第一个类是不是后面类中(某一个)的子类
# isinstance(qingjiao,(GuangDong,JiangXi))  # 判断实例是不是后面类中(某一个)的实例
'''

trips:
拓展用法(isinstance) 判断数据的类型

'''
isinstance(1,int)

type(1) == int
type(qingjiao) == HunXue    # 只能判断一个
'''

二.属性调用过程

我们来思考一个问题:
在这里插入图片描述

简单来说就是:当我们去调用属性,或者方法时,它会自动去调用底层的代码,我们可以自行修改底层代码,来达到我们想要的结果

在这里插入图片描述
在这里插入图片描述
代码如下:

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getattr__(self, item):    # item规范写,不是规定
        print(f'{item}属性不存在!')    # 重写底层代码,提供信息

在这里插入图片描述

三.魔法方法

魔法方法:   写法:  __特定英文__   调用时机特定

我们再来思考一个问题:
在这里插入图片描述
在这里插入图片描述
讲到__new__就不得不将单例模式(单个实例)

__new__   创建实例
class Person:
    def __init__(self,name,age):
        print('初始化对象')
        self.name = name
        self.age = age

    单例模式:  始终只有一个实例
    def __new__(cls, *args, **kwargs):   # cls表示类本身
        if not hasattr(cls,'_instance'): # 当类不存在_instance属性时(刚开始没有实例)   就创建实例
            cls._instance = super().__new__(cls)
        return cls._instance

        print('创建了实例')
        qj = super().__new__(cls)  # 继续创建实例
        return qj

在这里插入图片描述
其他的魔法方法:

__str__   __repr__  __call__
class Person:
    def __init__(self,name,age):
        print('初始化对象')
        self.name = name
        self.age = age

    def __str__(self):
        return 'this is str!'     # print()打印实例的时候输出

    def __repr__(self):
        return 'whis is repr!'    # 交互模式下直接输出

    def __call__(self):      #  可以让实例化对象被调用  qingjiao()
        print('我被调用了!')

在这里插入图片描述

四.协议

1.序列协议

# 序列协议
# class IndexTuple:
#     def __init__(self,*args):
#         self.values = tuple([i for i in args])   # 获取值
#         self.index = tuple(enumerate(self.values))    # 添加下标(枚举法)
#
#     def __len__(self):
#         return len(self.values)   # 调用底层的len()方法
#
#     def __getitem__(self,key):
#         # return self.values[key]       # 方法一
#         return self.index[key][1]
#
#     def __str__(self):
#         return str(self.values)
#
#     def __repr__(self):
#         return str(self.values)

2.迭代器协议

# 迭代器协议
# class Number:
#     def __init__(self,end=10):
#         self.start = 0
#         self.end = end
#
#     def __iter__(self):
#         return self      # 在实例化对象之后,将实例变成可迭代对象
#
#     def __next__(self):   # 让可迭代对象变成迭代器
#         if self.start >= start.end:
#             raise StopIteration   # 手动抛出异常,终止迭代
#         num = self.start
#         self.start += 1
#         return num

3.上下文协议

# 上下文协议   搭配with关键字使用
import time
class RunTime:
    def __enter__(self):    # 当碰到with关键字时运行
        self.start_time = time.time()

    def __exit__(self, exc_type, exc_val, exc_tb):   #当with关键字里面的代码运行完之后运行
        # exc_type: 异常类型
        # exc_val:异常值
        # exc_tb:追踪信息
        self.end_time = time.time()
        self.run_time = self.end_time - self.start_time
        print(self.run_time)

with RunTime():
    for i in range(10000):
        pass

五.作业

在这里插入图片描述

六.上次的作业答案(仅供参考,并非标准答案)

dic = {}
from decimal import Decimal
class Account:
    def __init__(self,user,password,money=0):
        self.user = user
        self.password = password
        self.money = money

    def deposit(self,money):
        if money >=0:
            self.money = Decimal(str(self.money))+Decimal(str(money))
            print(f'成功存入{money},此时余额为{self.money}')

    def withdraw(self,password,money):
        if money>=0 and money<=self.money and password == self.password:
            self.money = Decimal(str(self.money))-Decimal(str(money))
            print(f'成功取款{money}元,余额还剩{self.money}')

    def query(self,password):
        if password == self.password:
            print(f'余额为{self.money}')

    def close(self,user,password):
        if user == self.user and password == self.password:
            if self.money > 0:
                print(f'你的账户还有余额{self.money},请取走之后再来销户。')
            elif self.money == 0:
                self.user = None
                self.password = None
                print('你的账户已注销')

def login(user,password):
    a = Account(user,password)
    while True:
        number2 = input('请选择你要进行的操作:1、存款 2、取款 3、查询余额 4、销户 5、退出')
        if number2 == '1':
            money = float(input('请输入你要存入的金额:'))
            a.deposit(money)
        elif number2 == '2':
            money = float(input('请输入你要取出的金额:'))
            a.withdraw(password,money)
        elif number2 == '3':
            a.query(password)
        elif number2 == '4':
            a.close(user,password)
        elif number2 == '5':
            print('退出成功')
            break

print('-'*20,'欢迎来到银行','-'*20)
while True:
    number = input('请输入你的操作:1.开户 2.登录 3.退出')
    if number == '1':
        user_name1 = input('请输入你的用户名:')
        pwd1 = input('请输入你的密码:')
        pwd2 = input('请确认你的密码:')
        while pwd1 != pwd2:
            print('两次输入的密码不一样,请重新输入')
            pwd1 = input('请输入你的密码:')
            pwd2 = input('请确认你的密码:')
        else:
            dic[user_name1] = pwd2
            print('开户成功')

    elif number == '2':
        login_user = input('请输入你的用户名:')
        login_pwd = input('请输入你的密码:')
        while dic[login_user] != login_pwd:
            print('你输入的用户名或者密码不正确,请重新输入。')
            login_user = input('请输入你的用户名:') #
            login_pwd = input('请输入你的密码:') #
        else:
            print('登录成功')
            login(login_user,login_pwd)

    elif number == '3':
        print('欢迎下次光临!')
        break

七.结语

我们Python基础内容讲解即将结束,大家记得多多关注之后的文章,码字不易求三连.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寰( *^_^* )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值