python(十六)——对象属性与类属性,运算符重载,发送邮件程序

145 阅读4分钟

目录

对象属性与类属性

类属性与方法

类的私有属性

类的方法

类的私有方法

动态给实例添加方法和属性并使用

@property

运算符重载

发送邮件程序


对象属性与类属性

在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()

 

 

 

一起学习,一起进步 -.- ,如有错误,可以发评论