文章目录
- 一、类属性和对象属性的区别
- 二、所有类的基类是什么?
- 三、面向对象三大特性是什么?
- 四、什么是多重继承?
- 五、什么是构造函数?
- 六、定义一个装饰器检测其他函数运行时间
- 七、定义一个生成斐波那契数列的函数并放入模块,模块放入包中再调用它
- 八、什么是私有属性?如何定义?python中的私有属性是安全的吗?
- 九、查看、设置、获取对象属性的三个方法是什么?
- 十、如何限制类对象能绑定的属性?有办法绕过限制吗?
- 十一、如何在不改变属性绑定方式的基础上限制属性范围?
- 十二、菜单系统和类结合
- 十三、两种方式取出下面字符串中的汉字?
- 十四、内建模块和第三方模块?
- 十五、如何安装requests这个第三方模块?
- 十六、将一组数据存入excel或csv表格中?
- 十七、代码如下
一、类属性和对象属性的区别
类属性是直接可以被类调用的,也可以被实例对象调用的;对象属性不能被类名调用。
二、所有类的基类是什么?
object就是父类的父类,所有的类都要继承一个基类,什么都不写相当于默认object,所以说object是所有类的基类。
三、面向对象三大特性是什么?
面向对象的三大特性:继承、封装、多态
四、什么是多重继承?
在Python中,多重继承就是允许子类继承多个父类,子类可以调用多个父类的方法和属性。
但是,当多个父类拥有相同方法名的方法时,我们通过方法名调用父类方法就有一定的顺序。
在这个例子中,类C继承自类A和类B,类D继承自类A和类B,类E继承自类C和类D。
class A(object):
def test(self):
print("this is A.test()")
class B(object):
def test(self):
print("this is B.test()")
def check(self):
print("this is B.check()")
class C(A,B):
pass
class D(A,B):
def check(self):
print("this is D.check()")
class E(C,D):
pass
c1 = C()
c1.check() #继承B
结果:this is B.check()
c1.test() #继承A
结果:this is A.test()
d1 = D()
d1.test() #继承A
结果:this is A.test()
e1 = E()
e1.test() #继承A
结果:this is A.test()
五、什么是构造函数?
# 构造方法__init__()
class Complex:
def __init__(self,realpart,imagpart): #必须要有一个self参数
self.r = realpart
self.i = imagpart
x = Complex(3.0,-4.5)
print(x.r,x.i)
结果:3.0 -4.5
六、定义一个装饰器检测其他函数运行时间
面试考题装饰器检测时间
import time
def sign(func):
def wrapper(*args,**kwargs):
begin = time.time()
f = func(*args,**kwargs)
stop = time.time()
print(stop-begin)
return f
return wrapper
@sign
def testime():
time.sleep(1)
print('one two three!good job guys!!')
testime()
结果:
one two three!good job guys!!
1.011841058731079
七、定义一个生成斐波那契数列的函数并放入模块,模块放入包中再调用它
from aking.baby import Feibonaqi
for number in Feibonaqi.get_data(10):
print(number)
八、什么是私有属性?如何定义?python中的私有属性是安全的吗?
Python的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性。
即:私有属性是对象不愿意公开的属性。私有属性不安全。
class Staff:
def __init__(self,s_name,s_salary):
self.s_name = s_name
self.s__salary = s_salary
def __secret(self):
print("%s 的工资是 %d" % (self.s_name,self.s__salary))
(1). __salary是以两个下划线开头来定义的私有属性。
(2). __secret(self)是以两个下划线开头来定义的私有方法。
现在在对象的外部来调用一下__salary属性,看是否能正常访问该私有属性。
zhangsan = Staff('张三',10000)
print(zhangsan.__salary)
即在对象外部访问对象的私有属性 __salary 时,提示 AttributeError错误,Staff对象zhangsan没有属性 __salary。
九、查看、设置、获取对象属性的三个方法是什么?
1.hasattr(实例化对象,属性)#用于判断对象是否包含对应的属性,hasattr(object,name)object对象,name字符串属性名
2.setattr()#设定属性值,该属性不一定是存在的,setattr(object,name,value),object对象,name字符串,对象属性,value属性值
3.getattr()#用于返回一个对象属性值
class Dog():
pass
class RedDog(Dog):
def __init__(self):
self.x = 9
y = RedDog()
print(hasattr(y,'x')) #询问实例化对象y里面有没有x这个属性,结果:True
setattr(y,'xx',20) #对象、属性、绑定20
print(hasattr(y,'xx')) #结果:True
print(getattr(y,'xx')) #结果:20
十、如何限制类对象能绑定的属性?有办法绕过限制吗?
__slots__方法:限制类的属性;通过继承父类可以绕过限制
1.限制对象绑定的属性
class Student(object):
__slots__ = ('name','score','age')
stu1 = Student()
stu1.age = 23
print(stu1.age)
stu1.address = '623766656655X'
print(stu1.address) #结果:AttributeError: 'Student' object has no attribute 'address'
2.继承父类绕过限制
class Student(object):
__slots__ = ('name','score','age')
class Student1(Student):
pass
stu2 = Student1()
stu2.address = '623766656655X'
print(stu2.address) #结果:623766656655X
十一、如何在不改变属性绑定方式的基础上限制属性范围?
# @property装饰器
class Student:
#假如只暴露age()函数,表示当前这个属性只允许读,不允许修改
@property #把age属性暴露出去,函数名字就是属性名字
def age(self):
return self._age
@age.setter #当前age属性允许修改(赋值),其实真正的属性是_age
def age(self,value):
if value>150 or value<0:
raise ValueError('age在0~150之间')
self._age = value
stu = Student()
stu.age = 45 #age属性可以读也可以写
print(stu.age)
结果:45
十二、菜单系统和类结合
class Order:
# 桌号
def __init__(self, num):
self.num = num
order_menu = {} # 已点过的菜品及数量
menu = {'辣子鸡': 39, '红烧肉': 49, '麻婆豆腐': 19, '酸菜鱼': 59, '水煮肉片': 56, '米饭': 2, '鸡蛋汤': 9} # 菜品及其价格
Price = 0 # 总价格
# 主菜单
def main_menu(self):
choose = input("1、点(加)菜\n2、退菜\n3、查看菜单\n4、退出\n您需要输入数字{1,2,3,4}中的一个来选择服务类型:")
if choose not in {'1', '2', '3', '4'}:
print("输入有误,重新输入")
self.main_menu()
else:
if choose == '1':
self.order() # 点(加)菜
self.main_menu()
elif choose == '2':
self.menu_back() # 退菜
self.main_menu()
elif choose == '3':
self.menu_check() # 查看已点菜品
self.main_menu()
elif choose == '4':
print("您已退出") # 退出系统
# 菜单
def menu_check(self):
print("***************")
print("*您的桌号:" + str(self.num) + '号*')
print("***************")
if not self.order_menu:
print("客官您还没点餐哦")
else:
print("您的菜单:\n---------------")
for key, value in self.order_menu.items():
print(key + str(":") + str(value) + str("份"))
print("---------------\n总价:¥" + str(self.Price))
print("---------------")
# 确认选项和处理用户错误输入
# f=0表示点菜后是否继续点菜确认,f=1表示用户点菜时错误输入,f=2表示用户退菜时错误输入
def confirm_order(self, f):
if f == 0:
confirm = input("您是否还需要继续点菜(是:y 否:n):")
elif f == 1:
print("抱歉,客官!!!您点的菜我们没有,请您检查后重新点菜")
confirm = input("您是否还需要继续点菜(是:y 否:n):")
elif f == 2:
print("您输入的退菜信息有误,请您检查后重新退菜")
confirm = input("您是否还需要继续退菜(是:y 否:n):")
if confirm not in {'y', 'n'}:
print("客官输入有误,请在y和n中选择一项输入")
confirm = self.confirm_order(1)
else:
if confirm == 'y' and f in {0, 1}:
self.order()
elif confirm == 'y' and f == 2:
self.menu_back()
else:
print("您已退出退菜")
# 点菜功能,用户可选择菜品及数量,给出点餐总额
def order(self):
print('我们的菜单:')
for key, value in self.menu.items():
print(key + str(":¥") + str(value))
order_dish = input('请您点餐:')
if order_dish not in self.menu.keys():
self.confirm_order(1)
else:
if order_dish in self.order_menu:
dish_num = input("客官,您需要再加几份" + order_dish + ":")
if not dish_num.isdigit():
self.confirm_order(2)
else:
self.Price += int(dish_num) * self.menu[order_dish]
self.order_menu.update({order_dish: self.order_menu[order_dish] + int(dish_num)})
else:
dish_num = input("客官,您需要几份" + order_dish + ":")
if not dish_num.isdigit():
self.confirm_order(2)
else:
self.Price += int(dish_num) * self.menu[order_dish]
self.order_menu.update({order_dish: int(dish_num)})
self.confirm_order(0)
# 退菜
def menu_back(self):
back_dish = input('您要退的菜品:')
if back_dish not in self.menu.keys():
self.confirm_order(2)
elif back_dish not in self.order_menu:
print("您还未点该菜品")
self.menu_check()
else:
dish_num = input('您要退掉几份' + back_dish + '(all表示全部):')
if dish_num == 'all':
self.Price -= self.order_menu[back_dish] * self.menu[back_dish]
self.order_menu.pop(back_dish)
elif not dish_num.isdigit() or int(dish_num) > self.order_menu[back_dish]:
print('您输入的退菜数量有误')
self.confirm_order(2)
else:
self.Price -= int(dish_num) * self.menu[back_dish]
self.order_menu.update({back_dish: self.order_menu[back_dish] - int(dish_num)})
print('已为您退掉' + back_dish)
# 选座函数
def NO():
print('我们的桌号0-10,请输入0-10之间的数字')
num = input('请您落座:')
if not num.isdigit() or int(num) > 10 or int(num) < 0:
print('没有该桌号,请检查后落座')
NO()
else:
return num
num = NO()
Order(num).main_menu() # 用户进入程序点餐
十三、两种方式取出下面字符串中的汉字?
# sdfsdg%%中sdg啊¥W。国.#%
#方法一
from string import ascii_letters as al,whitespace as wh
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~“”?,!【】()、。:;’‘……¥·""" #找到源文件string.py修改为这个
strs = "sdfsdg%%中sdg啊¥W。国.#%"
lists = [x for x in strs if x not in al+wh+punctuation]
print(''.join(lists))
结果:中啊国
#方法二
import re
strs = "sdfsdg%%中sdg啊¥W。国.#%"
new = ''.join(re.findall('[^A-Za-z0-9\%\¥\。\.\#]', strs))
print(new)
结果:中啊国
十四、内建模块和第三方模块?
1.内建模块
import time
import datetime
import string
import os
import re
2.第三方模块
(1.)汉字转拼音
from xpinyin import Pinyin
(2.)faker模拟生成数据
from faker import Faker
十五、如何安装requests这个第三方模块?
pip install requests #可以在cmd里面用这个命令安装,也可以直接在Pycharm的settings点击+搜索requests,点击安装即可。
十六、将一组数据存入excel或csv表格中?
import xlsxwriter as xw
import pandas as pd
import openpyxl as op
"-------------数据用例-------------"
orderIds = [1,2,3,4]
names = ['李白','孟浩然','王阳明','柳宗元']
scores = [90,287,356,678]
testData = [orderIds,names,scores]
filename1 = '成绩单1.xlsx'
filename2 = '成绩单2.xlsx'
filename3 = '成绩单3.xlsx'
"--------------执行----------------"
def xw_toexcel(data,filename): # xlsxwriter库储存数据到excel
workbook = xw.Workbook(filename) # 创建工作簿
worksheet1 = workbook.add_worksheet("sheet1") # 创建子表
worksheet1.activate() # 激活表
title = ['序号','姓名','成绩'] # 设置表头
worksheet1.write_row('A1',title) # 从A1单元格开始写入表头
i = 2 # 从第二行开始写入数据
for j in range(len(data)):
insertData = [data[0][j],data[1][j],data[2][j]]
row = 'A' + str(i)
worksheet1.write_row(row, insertData)
i += 1
workbook.close() # 关闭表
xw_toexcel(testData,filename1)
def pd_toexcel(data,filename): # pandas库储存数据到excel
dfData = { # 用字典设置DataFrame所需数据
'序号':data[0],
'名字':data[1],
'成绩':data[2]
}
df = pd.DataFrame(dfData) # 创建DataFrame
df.to_excel(filename,index=False) # 存表,去除原始索引列(0,1,2...)
pd_toexcel(testData,filename2)
def op_toexcel(data,filename): # openpyxl库储存数据到excel
wb = op.Workbook() # 创建工作簿对象
ws = wb['Sheet'] # 创建子表
ws.append(['序号','名字','成绩']) # 添加表头
for i in range(len(data[0])):
d = data[0][i], data[1][i], data[2][i]
ws.append(d) # 每次写入一行
wb.save(filename)
op_toexcel(testData,filename3)
十七、代码如下
import requests
source = requests.get('https://www.23wx.cc/du/194/194918/').content.decode('gbk')
print(source)
可以直接获取到某网页源码,使用正则从中提取到
作者 最新章节 最后更新 简介 书名 以及 所有章节名和章节对应的连接(可以在浏览器打开这个连接看看)
import requests
import re
source = requests.get('https://www.23wx.cc/du/194/194918/').content.decode('gbk')
result1 = re.findall('<meta name="og:novel:author" content="(.*?)" />',source) #作者
for author in result1:
print('作者:',author)
result2 = re.findall('<meta name="og:novel:latest_chapter_name" content="(.*?)" />',source) #最新章节
for latest_chapter_name in result2:
print('最新章节:',latest_chapter_name)
result3 = re.findall('<meta name="og:novel:update_time" content="(.*?)" />',source) #最后更新
for update_time in result3:
print('最后更新:',update_time)
result4 = re.findall('<p>(.*?)!</p>',source) #简介
for id_intro in result4:
print('简介:',id_intro)
result5 = re.findall('<meta name="og:novel:book_name" content="(.*?)" />',source) #书名
for book_name in result5:
print('书名:',book_name)
result6 = re.findall(' <dd><a href="(.*?)">(.*?)</a></dd>',source) #所有章节名和章节对应的连接
for all_part1,all_part2 in result6:
print('href='+all_part1,all_part2)