天天看點

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