10.23day5作业:类和对象属性区别、面向对象、多重继承、构造函数、时间装饰器、私有属性、查看-设置-获取对象属性、抓取网页信息、Python库、将一组数据存入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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ゆきな

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值