面向对象编程(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#销毁一个实例的时候会调用析构函数,如果没有销毁的代码,则在程序运行完以后自动执行析构函数
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)
对于属性,我们通常采用类.属性或实例.属性的形式调用。
例如上例中的
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()
我的名字【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)#类变量不实例化也能调用
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)#类变量不实例化也能调用
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()
woaixuexi
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('邮件发送成功')
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')