多繼承的實作.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()