Python【day 17-2】面向对象-成员
''''''
'''
1、简述面向对象三大特性并用示例解释说明?【背写】
1、封装
狭义的封装:把一组属性封装到一个对象,创建对象的时候
广义的封装:代码块,函数、对象、类、模块-py文件都是封装
把封装后的对象看成一个黑盒子,只需要关注输入和输出,不必关注黑盒子内部的实现
2、继承
1、避免代码的重复
2、可扩展
共有的写在父类,扩展的时候用子类
3、多态 2. 面向中的变量分为哪几种?并用示例说明区别?【背写】
1、成员变量
写在构造方法中的,前面是self. 局部的意思
2、类变量(静态变量)
写在类中方法(成员方法)之外的变量,全局的意思
多个对象共享的 3. 面向对象中方法有哪几种?并用示例说明区别?【背写】
1、成员方法
1、包括构造方法和普通方法
2、第一个参数是self
3、通过对象来直接调用
2、静态方法
1、参数不需要self
2、写法是方法名字上面加上一行@staticmethod
3、通过类名来调用
4、把它理解成类中的函数即可
3、类方法
1、参数只有一个cls,表示可以说传入类名
2、写法是方法名字上面加上一行@classmethos
3、通过类名来调用
4、可以在类方法中创建对象,设计模式 4. 面向对象中的属性有什么?并用示例说明?
定义:用方法来表示一个属性(成员变量)
写法:方法名字上面加一行@property
只有一个参数self
必须有返回值(属性取的就是返回值)
调用:对象名.方法名
注意方法名字后面不加小括号
例子:人的年龄
1、成员变量中,一般不存储人的年龄,因为年龄每年都会变
2、成员变量中,存储的是人的生日
3、可以用成员方法,根据生日计算年龄,但是年龄是一个属性-名称
用方法-动词计算不是特别合适
4、就引入了用方法的变种--属性来表示年龄 5. 简述静态方法和类方法的区别?
1、写法不同
前者方法名字前面加上@staticmethod
后者方法名字前面加上@classmethod
2、参数不同
前者的参数没有self
后者的参数是cls
3、含义不同
前者可以理解成类中的函数,不需要传self,对象
后者的参数传入的是类名,主要用于对象的创建,设计模式 '''
6. 面向对象的方法中那个无需传参数?
静态方法无需传参数
成员方法self
类方法cls 7. 面向对象中公有和私有成员,在编写和调用时有哪些不同?
1、编写上
后者名字前面需要加上__,前者不需要
2、调用上
后者不能通过对象直接访问
后者可以通过对象调用公有成员方法的形式,访问私有变量或者私有方法
(把私有变量或者私有方法写在公有成员方法中) 前者可以通过对象直接访问
# 18.现有50条数据.请使用面向对象的思维来完成这50条数据的分页工作(升级题)
class Page:
def __init__(self,lst,pagesize):
self.lst = lst
self.pagesize = pagesize
def start(self):
'''
返回第一页的内容
'''
def end(self):
'''
返回最后一页的内容
'''
def index(self):
'''
返回指定页的内容
'''
page = input('请输入你要查询的数据的页数:') '''
伪代码思路:
第一步
1、一共是6条数据,每页2条,分成3页
2、输入页数1,打印1-2(索引号和值都是1,2)
3、输入页数3,打印5-6 第二步
1、一共是5条数据,每页2条,分成3页
2、输入页数1,打印1-2(索引号和值都是1,2)
3、输入页数3,打印5 ''' class Page:
def __init__(self,lst,pagesize):
self.lst = lst
self.pagesize = pagesize
def start(self):
'''
返回第一页的内容
'''
# total_page = len(self.lst)/self.pagesize
print(self.lst[:self.pagesize])
return self.lst[:self.pagesize] def end(self):
'''
返回最后一页的内容
'''
total_page = len(self.lst) / self.pagesize
# print(total_page)
if type(total_page) == int:
print(self.lst[-self.pagesize:])
return self.lst[-self.pagesize:]
else:
result, remainder = divmod(len(self.lst),self.pagesize)
# print(result) 2 商是2
# print(remainder) 1 余数是1
print(self.lst[-remainder:]) #[5]
return self.lst[-remainder:] def specified_page(self,n):
print(self.lst[self.pagesize*(n-1):self.pagesize*n])
return self.lst[self.pagesize*(n-1):self.pagesize*n] def index(self):
'''
返回指定页的内容
'''
while 1:
page = input('请输入你要查询的数据的页数,输入q退出:')
if page.upper() == 'Q':
print('退出了')
break
elif page == '':
self.start()
elif page == '-1':
self.end()
elif page.isdigit() == False:
print('只能输入数字,请输入数字')
elif int(page) <= (len(self.lst)/self.pagesize)+1 :
self.specified_page(int(page))
# elif int(page) > (len(self.lst) / self.pagesize) + 1 :
# print('页码超出范围了')
else:
print('页码超出范围了') # li1 = [1,2,3,4,5,6]
li1 = [1,2,3,4,5]
p1 = Page(li1,2) #一共是5条记录,每页2条记录
p1.index()
print('------------------------18 ')
''''''
'''
19.在昨天最后一题的基础上.把数据写入到文件中.并且注册的时候需要到文件中判断是否重
复.如果重复提示不能注册.(升级题
''' # 16. 补充代码:实现用户注册和登录
# class User:
# def __init__(self,user,pwd):
# self.user = user
# self.pwd = pwd class Account:
def __init__(self):
# user_list = [] #存放user对象 这个必须加上self变成成员变量才行
# self.user_list = [] #存放user对象 #注意点2:这里必须加self,表示成员变量(可以在方法间使用) #新建文件
# self.f1 = open('acount.txt',mode='w+',encoding='utf-8') #先w+ 后a+ 可写可读 每次都清空,覆盖
self.f1 = open('acount.txt',mode='a+',encoding='utf-8') #先w+ 后a+ 可追加可读
#1 新建文件,文件对象存储成成员变量,方便方法间使用 def register(self): #1 注册功能
print('欢迎来到注册页面')
username = input('请输入你要注册的登录用户名:')
password = input('请输入你要注册的登录密码:')
# u1 = User(username,password) #新建对象,对象中封装正确的用户名和密码
# self.user_list.append(u1) #self.user_list 表示成员变量(可以在方法间使用)
# print(self.user_list) #[<__main__.User object at 0x00000098C5EDF0C8>] #一、先判断用户名是否在文件中已经存在
self.f1.seek(0, 0) # 1光标到文件开头 关键点1
#是在第二次运行程序的时候,判断用户名是否存在的时候,从历史注册用户名中进行查找、判断、去重
for i in self.f1: # 2 遍历文件对象,读取文件中每一行
if username == i.split('|')[0]:#3 判断用户输入的用户名和文件中已经存在的用户名进行比对
print('用户名已经存在')
break #4,如果已经存在,就跳出整个for循环
else: #5 如果没有任何break 正常结束,执行else,如果有break,else下面就不会执行
# 如果不写else,即使有break,下面的内容也会执行; 有没有else,在break的情况下,执行是完全不同的
#6 往空白文件中写入用户名和密码
self.f1.write(username+'|'+password+'\n')
self.f1.flush() #7 将写入的及时刷新到文件
# self.f1.seek(0,0) #光标到文件开头
# self.f1.close() #8 先不关闭,如果在这里关闭,就会报错
#ValueError: I/O operation on closed file. def login(self): #2 登录接口
print('欢迎来到登录页面')
n = 0
for i in range(3): #3次重试机会
username2 = input('请输入你要登录的登录用户名:')
password2 = input('请输入你要登录的登录密码:')
# for i in self.user_list: #循环遍历用户对象 self.user_list表示成员变量(可以在方法间使用)
self.f1.seek(0, 0) # 1、光标到文件开头 关键点2
#2 在用户输入用户名和密码登录的时候,需要从文件开头遍历已经注册的用户名和密码
for i in self.f1: #3 循环遍历文件对象 self.f1表示成员变量(可以在方法间使用)
# if i.user == username2 and i.pwd == password2: #关键点1 i.user取的是对象的属性
if i.split('|')[0].strip() == username2 and i.split('|')[1].strip() == password2: #
#4 strip()是为了去掉换行符
#5 把用户输入的用户名密码和文件中的用户名密码进行匹配
print('登录成功')
# self.f1.close() #关闭文件 检查点
#ValueError: I/O operation on closed file.
# break #注意点3 只能退出当层内循环
return #注意点4 可以退出内层循环和外层循环(一次退出2层循环)
else: #6 这个else必须是和for同级,而不能是和if同级 关键点2
#因为期望结果的每行判断完,才能说明登录失败
n+=1
print('登录失败,请重新输入,你还有 %s 次重试机会' % (3-n) )
self.f1.close() # 7关闭文件 注意这行代码的位置 关键点3 def run(self):#3 选择注册还是登录,先注册,后登录
while 1:
choice = input('请选择,1表示注册,2表示登录,Q表示退出:')
if choice == '':
self.register() #注意点1 方法前面必须加上self
elif choice == '':
self.login() #注意点1 方法前面必须加上self
elif choice.upper() == 'Q':
print('已经退出了')
break
else:
print('你输入的不对,请重新输入') a1 = Account()
a1.run()
'''
注册和登录的逻辑:
1、注册的时候,把正确的用户名和密码,比如:jack/123 存入数据库(或者对象中,列表中)
保存之前,先判断用户名在文件中是否已经存在,如果重复提示不能注册
2、登录的时候,输入登录用户名和密码,拿用户输入的用户名和密码 和之前注册的用户名和密码进行比对
如果相等匹配,就是登录成功
如果不相等不匹配,就是登录失败
3、之前是将注册后的用户名和密码存在列表中--内存中
现在需要存在文件中(类似于-持久化到数据库) 注意点:
1、光标的位置回到文件的开头
2、关闭文件对象的代码所在的位置 扩展:
1、能否把对象写入文件中--不能
--文件中只能写入字符串,不能写入对象
2、先实现用户名|密码+换行符 写入文件
3、注册用户名去重--ok 接口的概念:
1、接口可以对外提供服务,对外提供功能,接口是服务端
2、客户端-发起端发起请求,调用登录接口
只需要传入正确的参数(用户名和密码),就可以登录成功
'''
Python【day 17-2】面向对象-成员的更多相关文章
- Python【day 17】面向对象-成员
类的变量分成2种: 1.成员变量 概念:在构造方法中的变量,前面带有self 作用:可以在类中不同的方法间使用 2.类变量-静态变量 概念:在类中,构造方法和普通方法之外,定义的变量 作用: 1.调用 ...
- python基础——17(面向对象)
一.名称空间 名称空间有内置名称空间,全局名称空间,局部名称空间.它是用来存放名字与值对应关系的地方. test.py文件: num = 10 def fn(): print("fn run ...
- python day10: 反射补充,面向对象
目录 pythdon day 10 1. 反射补充 16. 面向对象 16.1 面向对象初步介绍 16.2 面向对象和面向过程区别 16.3 对象的进化 17. 类class 17.1 类的定义 17 ...
- python day 17: UML(统一建模语言)
python day 17 UML:unified modeling languages,是一种基于面向对象的可视化建模语言. 画图语言:画图要合理.即符合逻辑. 历史: 3.1. 软件功能越来越强大 ...
- (转)Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...
- Python数据结构与算法--面向对象
前面已经讲过,Python是一种面向对象的编程语言. 面向对象编程语言中最重要的特征是允许程序员创建类建立数据模型来解决问题. 我们之前利用抽象数据类型提供的逻辑来描述数据对象 (它的状态) 和功能 ...
- python笔记 - day7-1 之面向对象编程
python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...
- 十七. Python基础(17)--正则表达式
十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...
- 【python学习-5】面向对象的python
python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
随机推荐
- kafka速度快的原因
我们都知道Kafka非常快,比绝大多数的市场上其他消息中间件都要快.这里来研究下那么为什么Kafka那么快(当然不会是因为它用了Scala). Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上 ...
- C#中获取指定目录下所有目录的名称、全路径和创建日期
场景 指定一个路径,根据这个父级路径获取此目录下所有目录的名称.全路径.创建日期等信息. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众 ...
- 解析innodb中的MVCC
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- FCC---Use the CSS Transform scale Property to Change the Size of an Element
To change the scale of an element, CSS has the transform property, along with its scale() function. ...
- 如何开发优质的 Flutter App:Flutter App 软件调试指南
本次博主带来的是<深入 Flutter 系列课程>第三讲,主要聊聊如何进行 Flutter App 代码的调试.本次课程将在GitChat平台上免费进行,通过本场 Chat,您将获得以下技 ...
- 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)
一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...
- 文本处理工具awk
目录 gawk:模式扫描和处理语言 awk语言 awk工作原理 print awk变量 自定义变量 printf命令 awk操作符 awk的条件判断 awk的循环 awk的数组 awk的函数 awk调 ...
- Linux自动同步时间
一.安装时间同步工具 yum -y install ntp 二.同步时间 1.修改时区 cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime v ...
- 有static的方法和没有static的调用
package com.yh.test02; public class Test { public static void main(String[] args) { Test.method1(); ...
- JavaScript中一个对象数组按照另一个数组排序
JavaScript中一个对象数组按照另一个数组排序 需求:排序 const arr1 = [33, 11, 55, 22, 66]; const arr2 = [{age: 55}, {age: 2 ...