python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

面向对象编程(OOP)术语:

class TestClass(object):

  val1 = 100
   
  def __init__(self):
    self.val2 = 200
   
  def fcn(self,val = 400):
    val3 = 300
    self.val4 = val
    self.val5 = 500
 if __name__ == '__main__':
  inst = TestClass()
    
  print TestClass.val1
  print inst.val1
  print inst.val2
  print inst.val3
  print inst.val4 
  print inst.val5

类:TestClass是一个类,用户定义的一个对象,定义一类对象的属性特点,是一个模型,模具,通用的;定义类的时候类名首字母都大写。

类变量:类变量紧接在类名后面定义,可以直接由类名直接调用,也可以由对象调用,val1是一个类变量,也叫做类属性,类属性应该是为其实例所共享的

构造函数:构造函数,是类在初始化的时候会自动执行它,如果你要在实例化的时候传入一些参数,那么你就可以在init这个函数中写参数

析构函数:实例被销毁的时候会执行析构函数 def  __del__(self): print('over')

                 del bus#销毁一个实例的时候会调用析构函数,如果没有销毁的代码,则在程序运行完以后自动执行析构函数

成员变量:val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;
                 val3不是成员变量,只是fcn方法里边的一个局部变量
                 val4和val5 也不是成员变量,它没有在构造函数中初始化
方法:方法是类里边的方法
实例化:创建一个类的实例.就比方把一个汽车模型造成一个实际的汽车,这个过程就叫做实例化,造出来的汽车就叫做实例。
             一个类可以有多个实例
             对象就是类的一个实例
实例变量:一个方法内定义的变量只属于一类的当前实例.
为了区分类变量和实例变量,我们来看一个例子,从一个帖子看到的,讲的比较详细 http://python.jobbole.com/85100/
class AAA():
aaa = 10

# 情形1
obj1 = AAA()
obj2 = AAA()
print(obj1.aaa,obj2.aaa,AAA.aaa)

# 情形2
obj1.aaa += 2
print(obj1.aaa,obj2.aaa,AAA.aaa)

# 情形3
AAA.aaa += 3
print(obj1.aaa, obj2.aaa,AAA.aaa)

Python中属性的获取
对于属性,我们通常采用类.属性实例.属性的形式调用。
例如上例中的AAA.aaa属于类.属性形式,obj1.aaa属于实例.属性的形式

Python中属性的设置
对于属性的设置我们通常采用类.属性 = 值实例.属性 = 值的形式
例如obj1.aaa = 3

上例中obj1.aaa += 2等价于obj1.aaa = obj1.aaa + 2,这句话包含了属性获取属性设置两个操作

上面我们指出obj.aaa += 2包含了属性获取属性设置两个操作。即obj1.aaa += 2等价于obj1.aaa = obj1.aaa + 2
其中等式右侧的obj.aaa属于属性获取,其规则是按照上面提到的查找规则进行,即,这时候,获取到的是AAA的属性aaa,所以等式左侧的值为12
第二个操作是属性设置,即obj.aaa = 12当发生属性设置的时候,obj1这个实例对象没有属性aaa,因此会为自身动态添加一个属性aaa
由于从对象的角度,类对象和实例对象属于两个独立的对象,所以,这个aaa属性只属于obj1,也就是说,这时候类对象AAA和实例对象aaa各自有一个属性aaa
那么,在情形3中,再次调用obj1.aaa时,按照属性调用查找规则,这个时候获取到的是实例对象obj1的属性aaa,而不是类对象AAA的属性aaa

我们查看执行结果:

10 10 10
12 10 10
12 13 13

self 的用法self代表类的实例,而非类。定义时需要而调用时又不需要。

Self

是类方法特有的一个参数,普通函数是没有的。定义类方法时,必须有一个额外的参数,并且他必须是第一个参数,它就是self。要注意的是,调用类方法时,并不需要给这个参数赋值,Python会提供这个值。这个特别的参数指对象本身,代表当前对象的地址。按照惯例它的名称是self,你也可以定义成其它名字,但是最好还是使用约定俗成的self。

class My():
def __init__(self,name):
self.name=name
self.cry()

def cry(self):
print('cry')

def learn(self):
self.skill=['开车']

def my_self(self):
print('我的名字【%s】,我会【%s】'%(self.name,self.skill))

我们先实例化一个对象:

pyf=My('pei')

直接执行查看结果打印:cry

在调用cry的时候self可以不用写,指的就是他自己

我们再调用learn和my_self

p1=My('pei')
p1.learn()
p1.my_self()

执行查看结果:

cry
我的名字【pei】,我会【['开车']】

p1=My('pei')
p1.learn()
p1.skill.append('抽烟')
p1.my_self()
执行查看结果:cry
我的名字【pei】,我会【['开车', '抽烟']】,可以看到打印出来的skill,p1.skill.append('抽烟')对类的属性进行的设置
实例变量:必须在实例化以后才能使用
class Person(object):
country='China'#类变量,直接在类里边定义的,公共的属性
def __init__(self,name,age,sex):
self.name=name#实例变量,必须实例化之后才能用
self.age=age
self.sex=sex
def say_my_country(self):
print(self.country)
# sss=Person('sss',33,'男')
print(Person.name)#不实例化的话是不会执行的
print(Person.country)#类变量不实例化也能调用
实例变量必须在实例化以后才能使用,上述代码中,如果不对person进行实例化,直接调用其中的变量,执行会报错
类变量不用实例化也能执行:
class Person(object):
country='China'#类变量,直接在类里边定义的,公共的属性
def __init__(self,name,age,sex):
self.name=name#实例变量,必须实例化之后才能用
self.age=age
self.sex=sex
def say_my_country(self):
print(self.country)
print(Person.country)#类变量不实例化也能调用
执行,可以打印出country
 
类方法,不需要实例化就能直接用,它可以使用类变量和类方法;
静态方法,不需要实例化就能直接使用,就是一个普通的函数,写在类里边而已,但是它不能调用类里边其他的函数,不能使用类变量和类方法,也不能用self
看下面的例子:
 
import redis

class MyRedis():
xiaolei='hahaha'
def __init__(self,host,password='',port=6379):
self.__host=host
self.passwd=password
self.port=port
self.__coon_redis()
def __coon_redis(self):
self.coon=redis.Redis(host=self.__host,password=self.passwd,port=self.port)
def get(self,k):
print('__host...',self.__host)
return self.coon.get(k).decode()

@staticmethod #静态方法 ,不需要实例化,但不能使用类方法
def othor():
print('woshi qita')
@classmethod #类方法,也不需要实例化,直接就能用,它比静态方法高级一些,可以使用类变量和类方法
def class_fun(cls):
print(cls.xiaolei)
@classmethod
def class_fun2(cls):
print('我是方法2')

MyRedis.class_fun2()
MyRedis.class_fun()
#都可以直接调用运行
 
 #继承
继承:如果定义的类有很多重复的功能,那就可以把这些重复的功能定义成父类,父类有的一些属性,变量子类都有,
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
基类:父类,也叫基类,假如我需要定义几个类,而类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义,这样只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性。
继承特点:
# 1.子类继承父类,子类拥有父类的所有属性和函数
# 2.子类继承父类,子类可以用自己独有的属性和函数,但是父类不可以使用子类独有的属性和函数
# 3.子类继承父类,子类可以重写父类的函数
 
例子:


class Person(object):#父类
def __init__(self,name,height,weigth): #构造函数
self.name=name
self.height=height
self.weight=weigth
def learn(self): #定义一个函数
print('woaixuexi')

class Women(Person):#子类
def __init__(self,name,heigth,weigth,age):#继承父类时,如有新加的,自己添加额外的元素
Person.__init__(self,name,heigth,weigth) # 子类不会自动调用父类的构造函数,需要手动调用一下,,要加入父类方法的引用
self.age=age#绑定
def aihao(self):
print('用户姓名:{name},用户身高:{heigth},用户体重:{weigth},用户年龄:{age},用户总资产:{moneys}'
.format(name=self.name, heigth=self.height, weigth=self.weight, age=self.age, moneys=10000))
def skill(self): #继承父类的方法
Person.learn(self)#需要调用


pyf=Women('pei','180cm','80jin','23')
pyf.aihao()
pyf.skill()
查看执行结果:
用户姓名:pei,用户身高:180cm,用户体重:80jin,用户年龄:23,用户总资产:10000
woaixuexi
 
 
########################################################################################################3
#邮件
python中发送邮件,用到了smtplib模块,和email模块首先要先导入该模块
剩下的就是发送邮件的过程了,
1、链接服务器,
2、登录邮箱,
3、发送服务请求
4、退出
 
以下是不带附件的邮件发送:
import smtplib
from email.mime.text import MIMEText
email_host='smtp.163.com'#邮箱的服务器地址
email_user='test@jzjz.com'#邮箱地址
email_pwd='test!123'#邮箱密码,#口令,QQ邮箱是输入授权码,在qq邮箱设置 里用验证过的手机发送短信获得,不含空格
email_list='test@qq.com,test@126.com'#j接收邮件地址
msg=MIMEText('新的一年,大家加油啊')#邮件内容
msg['Subject']='欢迎新同学'#邮件主题
msg['From']=email_user#发件人
msg['To']=email_list#接收人
smtp=smtplib.SMTP(email_host,port=25)#链接邮箱,传入邮箱地址端口号,SMTP端口号是25
# #smtp=smtplib.SMTP_SSL(email_host,port=465)#,QQ邮箱添加了安全连接发件箱地址是qq邮箱的话用这个
smtp.login(email_user,email_pwd)#登录邮箱
smtp.sendmail(email_user,email_list,msg.as_string())#发送邮件
smtp.quit()#退出
print('邮件发送成功')
如果要发送带附件的邮件,需要导入MIMEMultipart
 

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

email_host='smtp.163.com'#邮箱的服务器地址
email_user='test@jzjz.com'#邮箱地址
email_pwd='test!123'#邮箱密码,#口令,QQ邮箱是输入授权码,在qq邮箱设置 里用验证过的手机发送短信获得,不含空格
email_list='test@qq.com,test@126.com'#j接收邮件地址

msg=MIMEMultipart()
file='实例变量.py'
att=MIMEText(open(file,encoding='utf-8').read())#打开文件,读取文件内容
att["Content-type"]='application/octet-stream'
att["Content-Disposition"]='attachment;filename="%s"'%file
msg.attach(att)#把创建好的附件添加到正文里边
msg.attach(MIMEText('正文,其他请查看附件'))#添加邮件内容
msg['Subject']='测试邮件主题'#邮件主题
msg['From']=email_user
msg['To']=email_list
smtp=smtplib.SMTP(email_host,port=25)
smtp.login(email_user,email_pwd)
smtp.sendmail(email_user,email_list,msg.as_string())
smtp.quit()
print('chenggong')


 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/phoebes/p/8535415.html