zoukankan      html  css  js  c++  java
  • 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')


     
     
     
     
     
     
     
     
  • 相关阅读:
    博客园添加鼠标动态事件
    天津市蓟州区上仓中学恩师名单
    机器学习——支持向量机(Support Vector Machines)
    机器学习——贝叶斯和朴素贝叶斯
    使用jieba和gensim进行短文本分类(一):构建词向量
    Nginx(语法):05---Nginx配置文件语法
    docker单机部署 mysql8.0.20
    docker swarm 部署minio集群
    centos7 部署k8s集群
    docker compose 安装
  • 原文地址:https://www.cnblogs.com/phoebes/p/8535415.html
Copyright © 2011-2022 走看看