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

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 = name
		self.skin = skin
	
	def 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):
	pass
	
obj = 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):
	pass
	
obj = 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		    Woman
	Children
"""
class MyClass():
	pass

class Human():
	pty = 1
	def feelT(self):
		print("古代人类,天热了,光腚1")
		print(self.pty)
		print("古代人类,天冷了,穿寿衣2")
	
class Man(Human):
	# pty = 2
	def feelT(self):
		print("男人,天热了,光膀子3")
		print(super(),"<==2==>")
		super().feelT()
		print("男人,天冷了,光腚4")
	
class Woman(Human):
	# pty = 3
	def feelT(self):
		print("女人,天热了,脱毛5")
		print(super(),"<==3==>")
		super().feelT()
		print("女人,天冷了,穿貂6")

class Children(Man,Woman):
	# pty = 4
	def 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 = False
					print("恭喜你~ 注册成功~")
					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 = True
	while 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 = 1
				while times <= 3:
					ask_pwd = input("请输入您的登录密码:")
					if ask_pwd == pwd_true:
						print("恭喜您~ 登录成功~")
						sign = False
						break
					else:
						# 剩下次数 = 总次数-使用过的次数
						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 +=1
				
		else:
			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 = num
    def 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 = num
    def 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 = num
    def 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 = num
    def 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 = num
    def 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] = v

site = 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 = num
    def 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] = v

site = 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 = 0
	def count(self):
		print(self.__secretCount) # 获取
		self.__secretCount += 1

	def count3():
		print(JustCounter.__secretCount)
		JustCounter.__secretCount += 1
		print(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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值