多继承的实现.py
from Child import Child
def main():
c = Child(300, 100)
print(c.money, c.faceValue)
c.play()
c.eat()
# 注意:父类方法名相同,默认调用的是在括号中排前面的父类中的方法
c.func()
if __name__ == "__main__":
main()
Child.py
from Father import Father
from Mother import Mother
class Child(Father,Mother):
def __init__(self, money, faceValue):
# 写法
Father.__init__(self, money)
Mother.__init__(self, faceValue)
Mother.py
class Mother(object):
def __init__(self, faceValue):
self.faceValue = faceValue
def eat(self):
print("eat")
def func(self):
print("func2")
Father.py
class Father(object):
def __init__(self, money):
self.money = money
def play(self):
print("play")
def func(self):
print("func1")
多态
:一种事物的多种形态
最终目标:人可以喂任何一种动物
多态.py
from cat import Cat
from mouse import Mouse
from person import Person
tom = Cat("tom")
jerry = Mouse("jerry")
tom.eat()
jerry.eat()
# 思考:我再添加一百种动物,也都有name和eat方法
# 定义了一个有name属性和eat方法的Animal类,让所有的动物类都继承自Animal
# 定义一个人类,可以喂猫和老鼠吃东西
per = Person()
# per.feedCat(tom)
# per.feedMouse(jerry)
# 思考:人要喂100种动物,难道要写100种feed方法吗
# tom和jerry都继承自动物
per.feedAnimal(tom)
per.feedAnimal(jerry)
person.py
class Person(object):
"""
def feedCat(self, cat):
print("给你食物")
cat.eat()
def feedMouse(self, mouse):
print("给你食物")
mouse.eat()
"""
def feedAnimal(self, ani ):
print("给你食物")
ani.eat()
animal.py
class Animal(object):
def __init__(self, name):
self.name = name
def eat(self):
print(self.name + "吃")
cat.py
from animal import Animal
class Cat(Animal):
def __init__(self, name):
# self.name = name
super(Cat, self).__init__(name)
# def eat(self):
# print(self.name + "吃")
mouse.py
from animal import Animal
class Mouse(Animal):
def __init__(self, name):
# self.name = name
super(Mouse, self).__init__(name)
# def eat(self):
# print(self.name + "吃")
对象属性与类属性.py
class Person(object):
# 这里的属性实际上属于类属性(用类名来调用)
name = "person"
def __init__(self, name):
pass
# 对象属性
self.name = name
print(Person.name)
per = Person("tom")
# 对象属性的优先级高于类属性
print(per.name)
# 动态的给对象添加对象属性
per.age = 18 # 只针对于当前对象生效,对于类创建的其他对象没有作用
print(Person.name)
per2 = Person("lilei")
# print(per2.age) # 没有age属性
# 删除对象中的某个属性,再调用会使用到同名的类属性
del per.name
print(per.name)
注意:
千万不要将对象属性与类属性重名,因为对象属性会屏蔽掉类属性,但是当删除对象属性后,再使用又能使用类属性了。
动态给实例添加属性和方法并使用 slots.py
from types import MethodType
# 创建一个空类
class Person(object):
__slots__ = ("name", "age", "speak")
per = Person()
# 添加属性,这体现了动态语言的特点
per.name = "tom"
print(per.name)
# 动态添加方法
"""
此方法无法添加
def say(self):
print("my name is " + self.name)
per.sperk = say
per.sperk(per)
"""
def say(self):
print("my name is " + self.name)
per.speak = MethodType(say, per)
per.speak()
# 思考:如果我们想要限制实例的属性怎么办
# 比如:只给对象添加name,age,height,weight属性
# 解决:定义类的时候,定义一个特殊的属性(_slots_),可以限制动态添加的属性
# 下面被限制了
# per.height = 170
# print(per.height)
@property.py
class Person(object):
def __init__(self, age, name):
# 属性直接对外暴露
# self.age = age
# 限制访问
self.__age = age
self.__name = name
# 方法名为受限制的变量去掉双下划线
@property
def age(self):
return self.__age
@age.setter # 去掉下划线,setter
def age(self, age):
if age < 0:
age = 0
self.__age = age
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
"""
def getAge(self):
return self.__age
def setAge(self, age):
if age < 0:
age = 0
self.__age = age
"""
per = Person(18, "sunck")
# 属性直接对外暴露
# 不安全,没有数据的过滤
# per.age = -10
# print(per.age)
# 使用限制访问,需要自己写set和get方法才能访问
# per.setAge(15)
# print(per.getAge())
per.age = 100 # 相当于调用setAge
print(per.age) # 相当于调用getAge
print(per.name)
#@property:可以让你对受限制访问的属性使用点语法
运算符重载
print(1 + 2)
print("1" + "2")
# 不同的数据类型用加法会有不同的解释
class Person(object):
def __init__(self, num):
self.num = num
# 运算符重载
def __add__(self, other):
return Person(self.num + other.num)
def __str__(self):
return "mum = " + str(self.num)
per1 = Person(1)
per2 = Person(2)
print(per1 + per2)# per1 + per2 == per1.__add__(per2)
print(per1.__add__(per2))
print(per1)
print(per2)
import http.client
import urllib
host = "106.ihuyi.com"
sms_send_uri = "/webservice/sms.php?method=Submit"
# 下面需要修改 用户名,密码
account = "c580*****"
password = "32dc4c13668beeb673ba91202d61405d"
def send_sms(text, mobile):
params = urllib.parse.urlencode(
{'account':account, 'password':password, 'content':
text,'mobile':mobile, 'format':'json'})
headers = {'Content-type':'application/x-www-form-urlencoded','Accept':'text/plain'}
conn = http.client.HTTPConnection(host, port = 80, timeout = 30)
conn.request("POST", sms_send_uri, params, headers)
response = conn.getresponse()
response_str = response.read()
conn.close()
return response_str
if __name__ == '__main__':
# 手机号
mobile = "1500315****"
text = '您的验证码是:121254.请不要把验证码泄露给其他人'
print(send_sms(text, mobile))
发邮件.py
# 发邮件的库
import smtplib
# 邮件文本
from email.mime.text import MIMEText
# SMTP服务器
SMTPServer = "smtp.163.com"
# 发邮件的地址
sender = "******@163.com"
# 发送者邮箱的密码
passwd = "**************"
# 设置发送的内容
message = "bb"
# 转成邮件文本
msg = MIMEText(message)
# 标题
msg["Subject"] = "aa"
# 发送者
msg["From"] = sender
# 创建SMTP服务器
mailServer = smtplib.SMTP(SMTPServer, 25)
# 登陆邮箱
mailServer.login(sender, passwd)
# 发送邮件
mailServer.sendmail(sender, ["******@163.com", "********@163.com"], msg.as_string())
# 退出邮箱
mailServer.quit()