文章目录

  • 1. 构造方法__init__
  • 2. 单继承_多继承
    • 2.1 单继承
    • 2.2 多继承
  • 3. super的深度理解
  • 4. 注册_登录
    • 4.1 注册
    • 4.2 登录
  • 5. 小练习

1. 构造方法__init__

# ### __init__ 构造方法
'''触发时机:实例化对象,初始化的时候触发功能:为对象添加成员参数:参数不固定,至少一个self参数返回值:无
'''# (1) 基本语法
class MyClass():def __init__(self):print("构造方法被触发 ... ")self.color = "屎黄色"# 实例化对象
obj = MyClass()
print(obj.__dict__)
print(obj.color)# (2) 带有多个参数的构造方法
class MyClass():def __init__(self,color):self.color = color# 实例化对象
obj1 = MyClass("狗屎绿")
print(obj1.color)
obj2 = MyClass("粉嫩红")
print(obj2.color)# (3)类可以是一个,对象可以是多个,创造的对象彼此是独立的;
class Children():def __init__(self,name,skin):self.name = nameself.skin = skindef cry(self):print("小孩一下生久哇哇哇的哭")def la(self):print("小孩一下生久拉粑粑")def __eat(self):print("小孩一下生就要吃奶奶..")def info(self):print("小孩的名字:{},小孩的肤色{}".format(self.name,self.skin))def info2(self,name,skin):print("小孩的名字:{},小孩的肤色{}".format(name,skin))# 实例化对象
afanda = Children("阿凡达","深蓝色")
afanda.cry()
afanda.info()haoke = Children("绿巨人","绿色的")
haoke.la()
haoke.info()wangbaoqiang = Children("王宝强","亮绿色")
wangbaoqiang.info()
# wangbaoqiang.__eat() error
wangbaoqiang.info2("张保张","黄色")

2. 单继承_多继承

2.1 单继承

# ### 继承
"""
一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 是一种继承关系
被继承的类叫做父类(基类,超类),继承的类叫做子类(衍生类)
在python中所有类都继承object这个父类
继承: (1) 单继承  (2) 多继承
"""# ### 单继承
class Human(object):eye = "黑色的"def jump(self):print("古代人类都能上树")def beat_animal(self):print("古代人类都会打猎")def __makefire(self):print("古代人类会生火")# (1) 子父继承之后,子类可以调用父类的公有成员
class Man(Human):passobj = Man()
obj.jump()# (2) 子父继承之后,子类不能调用父类的私有成员
class Woman(Human):def pub_func(self):self.__makefire()obj2 = Woman()
# obj2.__makefire()  不行
# obj2.pub_func()    不行# (3) 子父继承之后,子类可以重写父类的同名公有方法
class Children(Human):def beat_animal(self):print("小孩天生只会打豆豆,不会打猎")obj3 = Children()
obj3.beat_animal()

2.2 多继承

# ### 多继承# (1) 基本语法
class Father():property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗"def f_hobby(self):print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")class Mother():property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘"def m_hobby(self):print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉")class Daughter(Father,Mother):passobj = Daughter()
print(obj.property)
obj.m_hobby()# (2) 多继承的成员调用
print("<=================>")
class Father():property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗"def f_hobby():print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")class Mother():property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘"def m_hobby(self):print(self.property)print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉")"""
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
"""
class Son(Father,Mother):property = "打游戏,吃小零食"def m_hobby(self):print("son中m_hobby方法")# 用类调用成员def skill1(self):Father.f_hobby()print(Mother.property)# 用对象调用成员"""self按照顺序找: 对象本身 => 类 => 父类 对应的成员 """def skill2(self):print(self.property)self.m_hobby()# 用super调用成员"""super()只调用父类的相关成员,顺带传递对象参数"""def skill3(self):print(super())print(super().property)super().m_hobby()obj2 = Son()
# obj2.skill1()obj2.property = "喜欢看lol,dnf,wow,跑跑卡丁车,ddo,霸王大陆,澄海3c"
# obj2.skill2()obj2.skill3()

3. super的深度理解

# ### 菱形继承 (钻石继承)
"""Human
Man         WomanChildren
"""
class MyClass():passclass Human():pty = 1def feelT(self):print("古代人类,天热了,光腚1")print(self.pty)print("古代人类,天冷了,穿寿衣2")class Man(Human):# pty = 2def feelT(self):print("男人,天热了,光膀子3")print(super(),"<==2==>")super().feelT()print("男人,天冷了,光腚4")class Woman(Human):# pty = 3def feelT(self):print("女人,天热了,脱毛5")print(super(),"<==3==>")super().feelT()print("女人,天冷了,穿貂6")class Children(Man,Woman):# pty = 4def feelT(self):print("小孩,天热了,光腚7")print(super(),"<==1==>")super().feelT()print("小孩,天冷了,多喝热水8")# ### super的深层理解
obj = Children()
obj.feelT()
# 73512648"""
# mro: 方法解析顺序 (c3算法计算的)
# 语法: 类.mro() => 列表
m :method
r :resolution
o :order
super 会自动根据mro列表返回出来的顺序关系,依次调用
super作用:专门用于解决复杂的多继承调用顺序关系;依照mro返回的列表顺序,依次调用;
super调用的顺序:会按照c3算法的广度优先原则进行调用
super传参:会默认在调用方法时,传递该对象参数;
"""
lst = Children.mro()
print(lst)
"""
[
<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>
]
"""# ### issubclass与isinstance
# issubclass 判断类的子父关系(应用在类与类之间)
"""只要在一条继承链上满足关系即可"""
res = issubclass(Children,Man)
res = issubclass(Children,Human)
res = issubclass(Children,MyClass)
# 如果元组当中有一个父类满足,即返回真
res = issubclass(Children,  (Man,Human,MyClass)  )
print(res)# isinstance 判断对象的类型  (应用在类与对象之间)
"""只要在一条继承链上满足关系即可"""
res = isinstance(obj,Children)
res = isinstance(obj,Human)
res = isinstance(obj,MyClass)
# 如果元组当中有一个类满足,即返回真
res = isinstance(obj,  (Man,Human,MyClass)  )
print(res)

小提示:

self参数要放在第一位,调用的时候,不用自己传参数,系统自动传的(传的是对象)如果对象里面没有这种这种方法,那么就会去类里面去调用(先找对象,再找类)
如果本类中没有这种方法,那么就回去父类中去调用方法(先找类,后找父类)
对象有没有-->创建这个对象的类有没有-->这个类的父类有没有如果继承多个父类,那么调用方法是,从左到右依次去找父类
super只调用父类,顺便把对象参数也传到父类里面self先看自己有没有,super只看父类有没有





4. 注册_登录

# ### 注册
# (1)检测两次密码如果相同,确认注册成功
# (2)检测两次密码如果不同,提示两次密码不一致
# (3)用户名不能重复# ### 登录小程序
# 账户密码会预先记录在文件中
# 输入账号密码:如果都正确,登录成功
# 如果用户登录时进行三次校验,都不对,记录黑名单文件中
# 如果是黑名单的用户,禁止下次再次登录

4.1 注册

# ### 注册
# (1)检测两次密码如果相同,确认注册成功
# (2)检测两次密码如果不同,提示两次密码不一致
# (3)用户名不能重复# 存放账户的列表
accountlist = []
fp = open("user.txt",mode="r+",encoding="utf-8")
for i in fp:# 获取账户名account = i.split(":")[0]# 添加到账户列表accountlist.append(account)sign = True
while sign:name = input("请输入您要注册的用户名:")if name == "" or " " in name:print("抱歉,该名字中含有非法字符")else:# 判断改名字是否被注册过了if name in accountlist:print("抱歉~ 您的用户名已被注册~")else:# 这个名字允许使用  # 确认用户的密码 输入第一次pwd1 = input("请输入您的密码:")while True:# 确认用户的密码 输入第二次pwd2 = input("请确认您的密码:")if pwd1 == pwd2:# 可以存储该账户密码到文件中strvar = name + ":" + pwd2 + "\n"fp.write(strvar)fp.close()sign = Falseprint("恭喜你~ 注册成功~")break# 退出当前的注册状态elif pwd2.upper() == "Q":print("欢迎下次再来~")break# 密码不一致else:print("两次密码不一致~")

用户名单user.txt

wangwen:111
lisi:222
zhangsan:333
zhaoliu:666

4.2 登录

# ### 登录小程序
# 账户密码会预先记录在文件中
# 输入账号密码:如果都正确,登录成功
# 如果用户登录时进行三次校验,都不对,记录黑名单文件中
# 如果是黑名单的用户,禁止下次再次登录# 账户列表
accountlist = []
# 密码列表
pwdlist = []
# 黑名单列表
blacklist = []with open("user.txt",mode="a+",encoding="utf-8") as fp:fp.seek(0)lst = fp.readlines()# print(lst)for i in lst:user,pwd = i.strip().split(":")# print(user,pwd)accountlist.append(user)pwdlist.append(pwd)# 账户列表和密码列表,按照相同的索引下标一一对应# print(accountlist) # ['wangwen', 'lisi', 'zhangsan', 'zhaoliu']# print(pwdlist)     # ['111', '222', '333', '666']sign = Truewhile sign:name = input("请输入您的用户名")if name in accountlist:# 打开黑名单,with open("black.txt",mode="a+",encoding="utf-8") as fp:fp.seek(0)lst = fp.readlines()for i in lst:blacklist.append(i.strip())# print(blacklist)# 检测是否是拉黑的用户if name in blacklist:print("抱歉~ 该账户已经被冻结,请联系客户人员~")else:# 走到这个分支,说明是合法用户,可以让用户输入密码index_num = accountlist.index(name)# print(index_num)# 通过索引号获取密码pwd_true = pwdlist[index_num]# print(pwd_true)# 控制密码输错次数不超过3次times = 1while times <= 3:ask_pwd = input("请输入您的登录密码:")if ask_pwd == pwd_true:print("恭喜您~ 登录成功~")sign = Falsebreakelse:# 剩下次数 = 总次数-使用过的次数print("抱歉您的密码输入错误,还剩下{}机会".format(3-times))if times == 3:print("抱歉~,输错三次,您的账号被冻结~")# 把当前用户拉黑,记录到黑名单中with open("black.txt",mode="a+",encoding="utf-8") as fp:strvar = name + "\n"fp.write(strvar)times +=1else:print("抱歉,该用户名不存在")

黑用户名单black.txt

lisi

5. 小练习

# ### 1.完成下列功能:# 1.1创建一个人类Person,再类中创建3个成员属性# animal = '高级动物'# soul = '有灵魂'# language = '语言'# 1.2在类中定义三个方法,吃饭,睡觉,工作.# 1.3在此类中的__init__方法中,给对象封装5个属性: 国家 , 姓名 , 性别 , 年龄 , 身高.# 1.4实例化四个人类对象:# 第一个人类对象p1属性为:中国,alex,未知,42,175.# 第二个人类对象p2属性为:美国,武大,男,35,160.# 第三个人类对象p3属性为:你自己定义.# 第四个人类对象p4属性为:p1的国籍,p2的名字,p3的性别,p2的年龄,p3的身高.# 1.5 通过p1对象执行吃饭方法,方法里面打印:alex在吃饭.# 1.6 通过p2对象执行吃饭方法,方法里面打印:武大在吃饭.# 1.7 通过p3对象执行吃饭方法,方法里面打印:(p3对象自己的名字)在吃饭.# 1.8 通过p1对象找到类中成员属性animal# 1.9 通过p2对象找到类中成员属性soul# 2.0 通过p3对象找到类中成员属性language# ### 2.通过自己创建类,实例化对象#通过调用对象当中的方法,在终端输出如下信息#小明,10岁,男,上山去砍柴#小明,10岁,男,开车去东北#小明,10岁,男,最爱大保健#老李,90岁,男,上山去砍柴#老李,90岁,男,开车去东北#老李,90岁,男,最爱大保健# ### 3.模拟英雄联盟写一个游戏人物的类#要求:#(1) 创建一个 Game_role 的类.#(2) 构造方法中给对象封装 name,ad(攻击力),hp(血量).三个属性.#(3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:#例: 实例化一个对象 盖伦,ad为10, hp为100#实例化另个一个对象 剑豪 ad为20, hp为80#盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血,  还剩多少血'的提示功能.# ### 4.请定义一个圆形类,有计算周长和面积的两个方法 (圆的半径通过参数传递给初始化方法)# ### 5创建AB两个类,A类中有属性abc=5把A类的对象存储在B类对象的成员属性pty中,用B类对象调用出abc这个值.# ### 简答题
# 1.类或对象是否能做字典的key
# 2.简述python的私有成员是如何实现的  _
# 3.私有成员能在类的外部使用么?能在子类中使用么?# ### 读代码,写答案
# 1.读程序写结果.(不执行)
class StarkConfig(object):def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)class RoleConfig(StarkConfig):def changelist(self,request):print('666')# 创建了一个列表,列表中有三个对象(实例)
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:print(item.num)# 2.读程序写结果.(不执行)
class StarkConfig(object):def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)class RoleConfig(StarkConfig):pass# 创建了一个列表,列表中有三个对象(实例)
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:item.changelist(168)
print(config_obj_list[0].num)# 3.读程序写结果.(不执行)
class StarkConfig(object):def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)class RoleConfig(StarkConfig):def changelist(self,request):print(666,self.num)config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:item.changelist(168)# 4.读程序写结果.(不执行)
class StarkConfig(object):def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)def run(self):self.changelist(999)class RoleConfig(StarkConfig):def changelist(self,request):print(666,self.num)config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
config_obj_list[1].run()
config_obj_list[2].run()  # 5.读程序写结果.(不执行)
class StarkConfig(object):def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)def run(self):self.changelist(999)class RoleConfig(StarkConfig):def changelist(self,request):print(666,self.num)class AdminSite(object):def __init__(self):self._registry = {}def register(self,k,v):self._registry[k] = vsite = AdminSite()
print(len(site._registry))
site.register('range',666)
site.register('shilei',438)
print(len(site._registry))  site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))
print(len(site._registry))
print(site._registry)# 6.读程序写结果.(不执行)
class StarkConfig():def __init__(self,num):self.num = numdef changelist(self,request):print(self.num,request)def run(self):self.changelist(999)class RoleConfig(StarkConfig):def changelist(self,request):print(666,self.num)class AdminSite():def __init__(self):self._registry = {}def register(self,k,v):self._registry[k] = vsite = AdminSite()
site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))for k,row in site._registry.items():row.changelist(5)
for k,row in site._registry.items():row.run()# 7.读程序写结果.(不执行)
class JustCounter:__secretCount = 0def count(self):print(self.__secretCount) # 获取self.__secretCount += 1def count3():print(JustCounter.__secretCount)JustCounter.__secretCount += 1print(JustCounter.__secretCount)class Bars(JustCounter):def count2(self):print(self.__secretCount)#  情况一
counter1 = JustCounter()
counter1.count()
counter1.count()
JustCounter.count3()
#  情况二
counter2 = Bars()
counter2.count()
counter2.count()
#  情况三
JustCounter.count3()

【二十一】Python全栈之路--构造方法_继承_登录注册相关推荐

  1. 【十二】Python全栈之路--推导式_生成器

    文章目录 1. 推导式 2. 推导式练习 3. 集合_字典推导式 4. 生成器 4.1 生成器表达式 4.2 生成器函数 5. 小练习 1. 推导式 # ### 推导式 : 通过一行循环判断遍历出一些 ...

  2. 【二十二】Python全栈之路--多态_小人射击

    文章目录 1. 多态 2. __new__魔术方法 3. 单态模式 4. del_str_repr 4.1 __del__ 4.2 __str__ 5. 小人射击 5.1 连贯操作 5.2 小人射击 ...

  3. 【四十二】Python全栈之路--JS

    文章目录 1. js对象 1.1 object对象 1.2 json对象 2. js字符串函数 3. js数组相关方法 4. js数学对象相关方法 5. BOM对象 5.1 定时器 5.2 获取年月日 ...

  4. Python全栈之路系列之数字数据类型

    上篇文章中我们简单的体验了Python语言基本概念与语法,那么在继续深入下去的过程中,不妨先学习几个常见的Python内置数据类型?这也是大部分Python教科书的学习目录,由浅至深,慢慢深入. Py ...

  5. python全栈开发要学些什么_战争热诚的python全栈开发之路

    从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...

  6. 【五十】Python全栈之路--django的orm

    文章目录 1. orm_sqlite介绍与数据库同步指令流程 1.1 orm对象关系映射 1.2 sqlite数据库 1.3 更新表结构 2. django配置连接mysql 3. orm字段和参数 ...

  7. 【四十六】Python全栈之路--bootstrap

    文章目录 1. bootstrap简单介绍_栅格_布局容器 1.1 bootstrap简单使用 1.2 布局容器 1.3 栅格单位 1.4 表单 2. bootstrao组件和插件简单使用 2.1 简 ...

  8. python全栈慕课网靠谱么_全栈和python的区别 ?

    1,全栈指的是人. 2,Python是一门编程语言. 全栈: 1,公司创始人/Co Founder全栈:技术+产品+设计+运营+销售+法务+融资+PR.作为公司创始人,在早期真的就是chief eve ...

  9. 【四十一】Python全栈之路--JS

    文章目录 1. js的数据类型 1.1 js引入方式 1.2 注释变量 1.3 数据类型 2. js类型转换_运算符 2.1 强制转换_Number 2.2 强制转换_String 2.3 强制转换_ ...

最新文章

  1. java开发面试复试_面试java开发,面试官会问哪些问题?
  2. 若不能连接到sql server的localhost
  3. 阻碍职场发达的十种做法
  4. Leetcode 213. 打家劫舍 II (每日一题 20211009)
  5. while(getchar()=='\n')continue;为什么作用是清空行
  6. 安卓APP_ 布局(3) —— FrameLayout帧布局
  7. MongoDB简介、在node中使用MongoDB
  8. 国内最火5款Java微服务开源项目
  9. LigoWave(力格微)无线网桥稳定性探秘——私有协议
  10. 通过Chrome浏览器检测和优化页面
  11. MySQL主从复制-基于GTID及多线程的复制
  12. mac vi快速删除_Mac下Vim编辑快捷键小结
  13. DB2 SQLCODE 异常大全编辑(四)
  14. pdf转图片怎么清晰?
  15. word详细使用方法(①)
  16. 【CCS仿真系列教程】手把手教你纯软件仿真实现音频滤波
  17. 8051单片机基础6:通用指针和定向指针
  18. android之空心字
  19. MATLAB中判断矩阵是否存在负数及负数的个数
  20. c语言超市货架管理设计报告,商品货架管理详解.doc

热门文章

  1. 对 Python 字典排序的两种简单方法
  2. 案例01-tlias智能学习辅助系统04-登录认证+全局异常处理
  3. 运维知识体系(你觉得运维需要掌握哪些知识)
  4. 力扣题解-1046. 最后一块石头的重量
  5. 装饰者模式Decorator
  6. 杰米斯·哈萨比斯:创造性和直觉很重要
  7. 4.类中static的作用
  8. 机器学习框架_编写生产级机器学习框架的经验教训
  9. LayaAir 2.0 正式版发布了,重要特性全面介绍
  10. 初识小程序 ——微信小程序的入门和使用