''''''
'''
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】面向对象-成员的更多相关文章

  1. Python【day 17】面向对象-成员

    类的变量分成2种: 1.成员变量 概念:在构造方法中的变量,前面带有self 作用:可以在类中不同的方法间使用 2.类变量-静态变量 概念:在类中,构造方法和普通方法之外,定义的变量 作用: 1.调用 ...

  2. python基础——17(面向对象)

    一.名称空间 名称空间有内置名称空间,全局名称空间,局部名称空间.它是用来存放名字与值对应关系的地方. test.py文件: num = 10 def fn(): print("fn run ...

  3. python day10: 反射补充,面向对象

    目录 pythdon day 10 1. 反射补充 16. 面向对象 16.1 面向对象初步介绍 16.2 面向对象和面向过程区别 16.3 对象的进化 17. 类class 17.1 类的定义 17 ...

  4. python day 17: UML(统一建模语言)

    python day 17 UML:unified modeling languages,是一种基于面向对象的可视化建模语言. 画图语言:画图要合理.即符合逻辑. 历史: 3.1. 软件功能越来越强大 ...

  5. (转)Python之路,Day6 - 面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  6. Python数据结构与算法--面向对象

    前面已经讲过,Python是一种面向对象的编程语言. 面向对象编程语言中最重要的特征是允许程序员创建类建立数据模型来解决问题. 我们之前利用抽象数据类型提供的逻辑来描述数据对象 (它的状态) 和功能 ...

  7. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

  8. 十七. Python基础(17)--正则表达式

    十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...

  9. 【python学习-5】面向对象的python

    python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...

  10. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

随机推荐

  1. Node.js module export async function

    一.Demo 1.首先定义 module 文件:bbb.js const fs = require("fs"); function readFileSync() { let res ...

  2. 【algo&ds】9.拓扑排序、AOV&AOE、关键路径问题

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性 ...

  3. AQS(AbstractQueuedSynchronizer)解析

    AbstractQueuedSynchronizer是JUC包下的一个重要的类,JUC下的关于锁相关的类(如:ReentrantLock)等大部分是以此为基础实现的.那么我们就来分析一下AQS的原理. ...

  4. django js 实现表格动态标序号

    <table class="table table-striped"> <thead> <tr class="key_words_head& ...

  5. [转]Sumifs函数多条件求和的9个实例

    本文转自:http://m.officezhushou.com/sumif/5187.html 第一部分:sumifs函数用法介绍 excel中sumifs函数是Excel2007以后版本新增的多条件 ...

  6. 2019 DevOps 必备面试题——代码版本控制篇

    原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...

  7. ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS

    使用orachk工具检查数据库实例的时候,发现报告里面有类似下面这样一些错误(最近有给Oracle 10g应用补丁PSU 10.2.0.5.180717,不清楚是这个产生的还是其他原因导致),使用脚本 ...

  8. 微信小程序出现 text 设置行高 line-height 无效的问题

    前言: 我在写程序过程中遇到过给text加line-height不生效的问题,但是也有生效的情况,如果不生效了就按下面的解决方法处理吧. 解决办法: 在text的外层嵌套一层view,然后给view设 ...

  9. pjd-fstest The test suite checks POSIX compliance - 测试文件系统posix 接口兼容性

    pjd-fstest: 参考网址:https://www.tuxera.com/community/posix-test-suite/ fstest是一套简化版的文件系统POSIX兼容性测试套件,它可 ...

  10. Deepin 15.9系统直接运行exe运行程序

    以下为你介绍在深度Deepin 15.9 Linux操作系统下直接运行exe文件的方法,此方法基于deepin-wine实现,经测试,一些exe文件是可以正常打开的,但部分可能会出现无法使用的情况,但 ...