python用法查询笔记(二)—— 面向对象


PS:文章中的代码名命方式只是便于理解,不是规范代码,实际操作请遵守代码规范~
(内赠完整python发邮件示例,含注释)

1. 创建类

语法:类名一般首字母要大写,(): 不能丢
class ClassName():# 如定义一个名为’狗’的类,可以写成class Dog():
def function1(): # 规范:class语句后续的代码块要缩进
#定义类中的函数1
例:

class 智能机器人():
    胸围 = 33
    腰围 = 44
    臀围 = 55
    智商 = 200
    def 打招呼():
        print('主人你好!')
    def 卖萌():
        print('主人,求抱抱!')
    def 生气():
        print('主人,我要报警了!')
    
print(智能机器人.智商)
智能机器人.打招呼()
智能机器人.卖萌()
智能机器人.生气()
'''
运行结果:200
主人你好!
主人,求抱抱!
主人,我要报警了!
'''

2. 把类中的变量传递给类中的函数

class 类A():
    变量1 = 100
    变量2 = 200
@classmethod  #①@classmethod声明了函数1是类方法
    def 函数1(cls): #②
        print(cls.变量1)#③
        print(cls.变量2)

类A.函数1()#三个格式缺一不可

3. 给类方法传参

class 念诗类():
    一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    
    @classmethod
    def 念诗函数(cls,参数):
        print('念给'+ 参数 +'的诗:')
        for i in cls.一首诗:
            print(i)

念诗类.念诗函数('张三')

4. 类的实例化

4.1.从外部增加/修改

class 幸运():
    @classmethod
    def 好运翻倍(cls):
        print('好的,我把它存了起来,然后翻了888倍还给你:' + str(cls.幸运数*888))
        # 或者这样写也可以:
        # print('好的,我把它存了起来,然后翻了888倍还给你:%d' % (cls.幸运数*888))

幸运.幸运数 = int(input('你的幸运数是多少?请输入一个整数。'))
幸运.好运翻倍()
'''
运行结果:
你的幸运数是多少?请输入一个整数。777
好的,我把它存了起来,然后翻了888倍还给你:689976
'''

4.2.从内部增加/修改

class 念诗类():
    一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    
    @classmethod
    def 念诗函数(cls):
        cls.接收人 = input('请输入你想给谁念诗:')
        print('念给'+ cls.接收人 +'的诗:')
        for i in cls.一首诗:
            print(i)

念诗类.念诗函数()
'''
运行结果:
请输入你想给谁念诗:啦啦啦
念给啦啦啦的诗:
《卜算子》
我住长江头,
君住长江尾。
日日思君不见君,
共饮长江水。
'''

5. 类的实例化

在这里插入图片描述

class():
    变量 = 100
实例1 =() # 实例化
实例2 =() # 实例化

print(.变量)
print(实例1.变量)  
print(实例2.变量)
'''
运行结果:
100
100
100
'''

6. 重写类方法

class():
    def 原始函数(self):
        print('我是原始函数!')

def 新函数(self):
    print('我是重写后的新函数!')

a =()  # 实例化
a.原始函数()

# 用新函数代替原始函数,也就是【重写类方法】.原始函数 = 新函数

# 现在原始函数已经被替换了
a.原始函数()
'''
运行结果:我是原始函数!
我是重写后的新函数!
'''

注意:这里的赋值是在替换方法,并不是调用函数,所以【不要加上括号】—— 写成类.原始函数() = 新函数()是错误的。

7. 初始化函数

class 成绩单():
    def __init__(self,学生姓名,语文_成绩,数学_成绩):
        self.学生姓名 = 学生姓名
        self.语文_成绩 = 语文_成绩
        self.数学_成绩 = 数学_成绩

    def 打印成绩单(self):
        print(self.学生姓名 + '的成绩单如下:')
        print('语文成绩:'+ str(self.语文_成绩))
        print('数学成绩:'+ str(self.数学_成绩))


成绩单1 = 成绩单('张三',99,88)
成绩单2 = 成绩单('李四',64,73)
成绩单3 = 成绩单('王五',33,22)

成绩单1.打印成绩单()
成绩单2.打印成绩单()
成绩单3.打印成绩单()
'''
运行结果:
张三的成绩单如下:
语文成绩:99
数学成绩:88
李四的成绩单如下:
语文成绩:64
数学成绩:73
王五的成绩单如下:
语文成绩:33
数学成绩:22
'''

8. 继承

格式:单继承–class 子类(父类) 多重继承–class 子类(父类1,父类2)

class 基础机器人():
    def __init__(self,参数):
        self.姓名 = 参数

    def 自报姓名(self):
        print('我是' + self.姓名 + '!')     

    def 卖萌(self):
        print('主人,求抱抱!')

class 高级机器人(基础机器人):
    def 高级卖萌(self):
        print('主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!')

安迪 = 高级机器人('安迪')
安迪.自报姓名()
安迪.卖萌()
安迪.高级卖萌()

重写子类方法

class 基础机器人():
    def __init__(self,参数):
        self.姓名 = 参数

    def 自报姓名(self):
        print('我是' + self.姓名 + '!')     

    def 卖萌(self):
        print('主人,求抱抱!')
class 高级机器人(基础机器人):
    def 自报姓名(self):
        print('我是高级机器人' + self.姓名 + '!')

    def 卖萌(self):
        print('主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!')

安迪 = 高级机器人('安迪')
安迪.自报姓名()
安迪.卖萌()
'''
运行结果:
我是高级机器人安迪!
主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!
'''

文件

1. 关于open()函数

格式:

open(r'c:\Users\Administrator\Desktop\test\abc.txt','r',encoding='gbk')

PS:打开文件必须关掉即file1.close()
为防止忘记关闭,可采用写法二:

with open(‘abc.txt’,’a’) as file1:
file1.write(‘hhh’)

记得缩进,记得冒号

在这里插入图片描述

2. 读取文件

#读文件:开----关
file1 = open(r'c:\Users\Administrator\Desktop\test\abc.txt','r',encoding='gbk')
filecontent = file1.read()
print(filecontent)
file1.close()

3. 写入文件

#写文件:开--写--关
file1 = open(r'c:\Users\Administrator\Desktop\test\abc.txt','a',encoding='gbk')
file1.write('我真是一个小机灵鬼\n')
file1.write('哈哈哈\n')
file1.close()

4. 对文件内容操作涉及的一些函数

  • readlines()----按行读取
    readlines() 会从txt文件取得一个列表,列表中的每个字符串就是txt文件中的每一行。而且每个字符串后面还有换行的\n符号。
file1 = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8') 
file_lines = file1.readlines()
file1.close()
for i in file_lines:    #用for...in...把每一行的数据遍历
print(i)            #打印变量

在这里插入图片描述

  • split()----按空格把字符串里的内容分开
file1 = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8') 
file_lines = file1.readlines()
file1.close()
for i in file_lines:   #用for...in...把每一行的数据遍历  
    data =i.split()    #把字符串切分成更细的一个个的字符串
    print(data)        #打印出来看看

在这里插入图片描述

  • join()-----合并字符串

join()的用法是str.join(sequence),str代表在这些字符串之中,你要用什么字符串连接,在这里两个例子,一个是空字符串,一个是横杠,sequence代表数据序列,在这里是列表a。

a=['c','a','t']
b=''
print(b.join(a))
c='-'
print(c.join(a))

#》》cat
     c-a-t

5. 关于编码

print('小吴'.encode('gbk'))
print(b'\xd0\xa1\xce\xe2'.decode('gbk'))
print('小吴'.encode('utf-8'))
print(b'\xe5\xb0\x8f\xe5\x90\xb4'.decode('utf-8'))

#》》
b'\xd0\xa1\xce\xe2'
小吴
b'\xe5\xb0\x8f\xe5\x90\xb4'
小吴

模块

1. 使用自己的模块

  • import语句

主要目的:导入整个模块,利用模块中已经封装好的变量、函数、类。
用法二:import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”。


#test.py#
a = '我是模块中的变量a'
def hi():
    a = '我是函数里的变量a'
    print('函数“hi”已经运行!')

class Go1:  # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省
    a = '我是类1中的变量a'
    @classmethod
    def do1(cls):
        print('函数“do1”已经运行!')

class Go2:
    a = '我是类2中的变量a'
    def do2(self):
        print('函数“do2”已经运行!')
# 这是主程序main.py# 
import test  # 导入test模块
print(test.a)  # 使用“模块.变量”调用模块中的变量

test.hi()  # 使用“模块.函数()”调用模块中的函数
print(test.Go1.a)   # 使用“模块.类.变量”调用模块中的类属性
test.Go1.do1()  # 使用“模块.类.函数()”调用模块中的类方法

A = test.Go2()  # 使用“变量 = 模块.类()”实例化模块中的类print(A.a)  # 实例化后,不再需要“模块.”
A.do2()  # 实例化后,不再需要“模块.”
'''
我是模块中的变量a
函数“hi”已经运行!
我是类1中的变量a
函数“do1”已经运行!
我是类2中的变量a
函数“do2”已经运行!
'''
  • from … import …语句
    用途:从模块中导入一个指定的部分到当前模块。
    格式:
    在这里插入图片描述
# 【文件:test.py】def hi():
    print('函数“hi”已经运行!')
# 【文件:main.py】from test import hi  # 从模块test中导入函数“hi”
hi()  # 使用函数“hi”时无需加上“模块.”前缀
'''
函数“hi”已经运行!
'''

从模块中同时导入多个指定内容:用逗号隔开,写成from xx模块 import a,b,c的形式。

从模块中指定所有内容直接使用:可以写成【from xx模块 import *】的形式,*代表“模块中所有的变量、函数、类”。(一般不建议)

  • if name == 'main’语句
    在这里插入图片描述
#A.py#
import B	#运行结果为空

#B.py#
a = '我是模块中的变量a'

def hi():
    a = '我是函数里的变量a'
    print('函数“hi”已经运行!')

class Go1:  # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省
    a = '我是类1中的变量a'
    @classmethod
    def do1(cls):
        print('函数“do1”已经运行!')

class Go2:
    a = '我是类2中的变量a'
    def do2(self):
        print('函数“do2”已经运行!')

if __name__ == '__main__':
    print('是主模块的时候才会执行以下语句:')
    print(a)
    hi()
    print(Go1.a)
    Go1.do1()
    a = Go2()
    print(Go2.a)
    a.do2()	
'''
#运行B.py时结果如下:
是主模块的时候才会执行以下语句:
我是模块中的变量a
函数“hi”已经运行!
我是类1中的变量a
函数“do1”已经运行!
我是类2中的变量a
函数“do2”已经运行!
'''

2. 使用他人模块

3. 模块用法示例

  • smtplib模块:发邮件
    在这里插入图片描述
    在这里插入图片描述
    用法:
import smtplib   #引用smtplib模块

server = smtplib.SMTP()  #通过SMTP协议指定服务器

server.connect(host, port)
#连接指定的服务器  
# host:服务器域名  
# port:端口(默认为25)

server.login(username, password) 
#username:登录邮箱的用户名
#password:授权码

server.sendmail(sender, to_addr, msg.as_string()) 
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 

server.quit() 
#退出服务器,结束SMTP会话

在这里插入图片描述

  • email模块:构建邮件内容
    MIMEText:内容形式为纯文本、HTML页面
    MIMEImage:内容形式为图片
    MIMEMultipart:多形式组合,可包含文本和附件。

导入形式

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

MIMEText()方法需要输入三个参数:文本内容,文本类型和文本编码。
例:

msg = MIMEText('send by python','plain','utf-8')
  • MyQR模块——制作二维码
    在这里插入图片描述
'''
自制动态二维码
使用MyQR模块
'''
# 先导入模块
from MyQR import myqr

myqr.run(
    words='https://baike.baidu.com/item/%E8%82%96%E6%88%98/18866899?fr=aladdin',
    # 扫描二维码后,显示的内容,或是跳转的链接
    version=5,  # 设置容错率
    level='H',  # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
    picture='xz.gif',  # 图片所在目录,可以是动图
    colorized=True,  # 黑白(False)还是彩色(True)
    contrast=1.0,  # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。
    brightness=1.0,  # 用来调节图片的亮度,用法同上。
    save_name='Python.gif',  # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif
    )

完整发邮件示例

import smtplib
from email.mime.text import MIMEText
from email.header import Header
import csv
#from email.mime.image import MIMEImage
#from email.mime.multipart import MIMEMultipart

#发信方信息:发信邮箱、QQ邮箱授权码
from_addr = input('请输入登录邮箱:')    
password = input('请输入邮箱授权码:')   


#收信方邮箱
#to_addr =  input('请输入收件邮箱:') 
to_addr = [] 
while True:
    a = input('请输入收件人邮箱:')
    to_addr.append(a)
    b = input('是否继续,n退出,任意键继续:')
    if b == 'n':
        break
    
print(to_addr)

# 待写入csv文件的收件人数据:人名+邮箱
data = [['xxx','xxx@qq.com'],['xxx','xxx@qq.com']]

#写入收件人数据
with open('to_addr.csv','w',newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

#发信服务器
smtp_server = 'smtp.qq.com'

#发信内容
text = """Hi,你好啊,这是我的第一封python邮件!
收到这封邮件,说明我成功运行了代码^-^
For you , a thousand times over!
为你千千万万遍
愿山河无恙,你我相安!
"""
#读取收件人数据,并启动写信和发信流程
with open('to_addr.csv','r') as f:
    reader = csv.reader(f)
    for row in reader:
        to_addr = row[1]
        msg = MIMEText(text,'plain','utf-8')

        #邮件头信息
        msg['From'] = Header(from_addr)
        msg['To'] = Header(','.join(to_addr))
        #msg['To'] = Header(to_addr)
        msg['Subject'] = Header('python test')

        #开启发信服务,这里使用加密传输
        server = smtplib.SMTP_SSL(smtp_server)
        server.connect(smtp_server, 465)#如果出现编码错误UnicodeDecodeError,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')
        #登录发信邮箱
        server.login(from_addr, password) 
        #发送邮件
        try:
            server.sendmail(from_addr, to_addr, msg.as_string()) 
            print('发送成功!')
        except:
            print('出错啦,再检查一下吧!')
#关闭服务器
server.quit()

其余的请自行探索~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值