目录
对象属性与类属性
在python中,一个对象的特征也称为属性(attribute)。它所具有的行为也称为方法(method)
结论:对象=属性+方法
在python中,把具有相同属性和方法的对象归为一个类(class)
类属性与方法
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
class Person(object):
#这里的属性是类属性,用类名来调用
name = "aaa"
#这里是对象属性
def __init__(self,name):
self.name = name
a = Person("kkk")
print(Person.name)
print(a.name)
如果没有对象属性,对象属性的优先级高于类属性
class Person(object):
#这里的属性是类属性,用类名来调用
name = "aaa"
#这里是对象属性
def __init__(self,name):
pass
#self.name = name
a = Person("kkk")
print(Person.name)
print(a.name)
动态给对象添加属性 ,只对于当前对象生效,对类创建的其他对象不生效
a = Person("kkk")
#动态给对象添加属性
a.age = 18
print(a.age)
删除对象中的name属性,会调用类中的name属性
class Person(object):
#这里的属性是类属性,用类名来调用
name = "aaa"
#这里是对象属性
def __init__(self,name):
self.name = name
a = Person("kkk")
print(a.name)
#删除对象中的name属性,会调用类中的name属性
del a.name
print(a.name)
动态给实例添加方法和属性并使用
from types import MethodType
#创建一个空类
class Fun():
pass
a = Fun()
#动态添加属性,这体现了动态语言的特点(灵活)
a.name = "Jerry"
#动态添加方法
def say(self):
print("my name is " + self.name)
a.speak = MethodType(say,a)
a.speak()
如果想要限制添加的实例属性,只允许给对象添加name,age,height,weight属性
解决方法:在定义类的时候,定义一个特殊的属性(__slots__),这个属性可以限制动态添加的属性
示例:
class Fun():
__slots__ = ("name","age","height","weight")
a = Fun()
#动态添加属性,这体现了动态语言的特点(灵活)
a.name = "Jerry"
print(a.name)
a.age = 18
print(a.age)
a.sex = "man"
print(a.sex)
@property
之前定义__init__()时属性直接对外暴露,不安全
class Fun(object):
def __init__(self,name):
#属性直接对外暴露
self.name = name
a = Fun("lisi")
#属性直接对外暴露
#不安全,没有数据的过滤
a.name = "zhangsan"
print(a.name)
使用限制访问的方法
class Fun(object):
def __init__(self):
pass
#self.name = name
#限制访问
def getName(self):
return self.__name
def setName(self,name):
if len(name)>10:
self.__name = ""
else:
self.__name = name
a = Fun()
#使用限制访问
a.setName("zhangsan")
print(a.getName())
使用property:可以让你对受限制访问的属性使用点语法
class Fun(object):
def __init__(self):
pass
#self.name = name
#限制访问
#如果两个方法命名相同,下面的方法将覆盖掉上面的方法
@property
def Name(self):
return self.__name
@Name.setter #去掉下划线.setter
def Name(self,name):
if len(name)>10:
self.__name = ""
else:
self.__name = name
a = Fun()
a.Name = "zhangsan" #相当于调用setName()
print(a.Name) #相当于调用getName()
运算符重载
不同的类型用加法会有不同的解释
运算符+ : __add__
class Sum(object):
def __init__(self,num):
self.num = num
a = Sum(2)
b = Sum(3)
print(a + b)
class Sum(object):
def __init__(self,num):
self.num = num
#运算符重载
def __add__(self,other):
return Sum(self.num + other.num)
def __str__(self):
return "sum = "+str(self.num)
a = Sum(2)
b = Sum(3)
print(a + b)
a + b 等价于 a.__add__(b)
print(a + b)
print(a.__add__(b))
发送邮件程序
#发邮件的库
import smtplib
#邮件文本
from email.mime.text import MIMEText
#SMTP服务器
SMTPServer = "smtp.163.com"
#发邮件的地址
Sender = "suncksunck@163.com" #自己的邮件地址
#发送者邮箱的密码
passwd = "1234567890a" #授权密码
#设置发送的内容
message = "this is a email to you"
#转换成邮件文本
msg = MIMEText(message)
#邮件主题
msg["Subject"] = "boynextdoor"
#发送者
msg["From"] = Sender
#创建SMTP服务器
mainServer = smtplib.SMTP(SMTPServer,25)
#登录邮箱
mainServer.login(Sender,passwd)
#发送邮件
mainServer.sendmail(Sender,["你要发送的人的邮箱"],msg.as_string())
#退出邮箱
mainServer.quit()
一起学习,一起进步 -.- ,如有错误,可以发评论