天天看点

12.千峰教育面向对象提升与收发邮件----自制随堂笔记多态

多继承的实现.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()