Python全棧(第一期)Day22
阿新 • • 發佈:2018-12-19
今日主要內容:
面向物件的引入
初始面向物件
面向物件的互動
實踐
一,面向物件引入
1,程式設計方式
面向過程程式設計
面向函式程式設計
面向物件程式設計
2,人狗大戰
def Dog(name,blood,aggr,kind): dog = { 'name': name, 'blood': blood, # 血量 'aggr': aggr, # 攻擊力 'kind': kind, } def bite(person): person['blood'] -= dog['aggr'] print('%s被咬了,掉了%s的血' % (person['name'], dog['aggr'])) dog['bite'] = bite return dog def Person(name,blood,aggr,sex): person = { 'name' : name, 'blood': blood, # 血量 'aggr': aggr, # 攻擊力 'sex':sex, } def attack(dog): dog['blood'] -= person['aggr'] print('%s被打了,掉了%s的血' % (dog['name'], person['aggr'])) person['attack'] = attack return person # 程式碼精簡了 方便增加人物 方便修改 人物更加規範 —— 人模子 jin = Dog('金老闆', 1000, 100, 'teddy') alex = Person('狗剩兒', 100, 1, '不詳') print(jin) jin['bite'](alex) # alex['attack'](jin) # Dog函式和Person函式 都是定義了一類事物 # 直到呼叫了函式,賦值了之後才真的有了一個實實在在的人或狗 # 面向物件程式設計 # 所謂模子 就是 類 抽象的 我能知道有什麼屬性 有什麼技能 但不能知道屬性具體的值
輸出結果:
{‘name’: ‘金老闆’, ‘blood’: 1000, ‘aggr’: 100, ‘kind’: ‘teddy’, ‘bite’: <function Dog..bite at 0x0000026D029F9C80>}
狗剩兒被咬了,掉了100的血
二,初始面向物件
1,基本模型
# 自定義類
# def 函式名():
# pass
class 類名:
屬性 = 'a'
print(類名.屬性)
# 類名的作用 就是操作屬性 檢視屬性
輸出結果:
a
2,人狗大戰改寫(人)
class Person: # 類名,這個地方不接收變數 country = 'China' # 創造了一個只要是這個類就一定有的屬性 # 類屬性 靜態屬性 def __init__(self, *args): # 初始化方法,self是物件,是一個必須傳的引數 # self就是一個可以儲存很多屬性的大字典 self.name = args[0] # 往字典裡新增屬性的方式發生了一些變化 self.hp = args[1] self.aggr = args[2] self.sex = args[3] def walk(self, n): # 這裡的self,不一定非得是self print('%s開啟疾走,共行%s進步!' % (self.name, n)) alex = Person('狗剩兒', 100, 1, '不詳') # 類名還可以例項化物件,alex物件 # 例項化 print(alex.__dict__) # 檢視所有屬性 print(alex.name) # 檢視屬性值 # Person.walk(alex,5) 這兩行程式等價 alex.walk(5) print('000000000000000000000000000000000') # 可以更改 print(Person.__dict__['country']) alex.__dict__['country'] = '印度' print(alex.__dict__['name']) alex.__dict__['name'] = '二哥' print(alex.__dict__) # 可以新增(字典操作) alex.age = 83 print(alex.__dict__)
輸出結果:
{‘name’: ‘狗剩兒’, ‘hp’: 100, ‘aggr’: 1, ‘sex’: ‘不詳’}
狗剩兒
狗剩兒開啟疾走,共行5進步!
000000000000000000000000000000000
China
狗剩兒
{‘name’: ‘二哥’, ‘hp’: 100, ‘aggr’: 1, ‘sex’: ‘不詳’, ‘country’: ‘印度’}
{‘name’: ‘二哥’, ‘hp’: 100, ‘aggr’: 1, ‘sex’: ‘不詳’, ‘country’: ‘印度’, ‘age’: 83}
3,知識點總結
# 物件 = 類名() # 過程: # 類名() 首先 會創造出一個物件,建立了一個self變數 # 呼叫init方法,類名括號裡的引數會被這裡接收 # 執行init方法 # 返回self # 物件能做的事: # 檢視屬性 # 呼叫方法 # __dict__ 對於物件的增刪改查操作都可以通過字典的語法進行!! # 類名能做的事: # 例項化 # 呼叫方法 : 只不過要自己傳遞self引數。 # 呼叫類中的屬性,也就是呼叫靜態屬性。 # __dict__ 對於類中的名字只能看!不能操作!不能操作!不能操作!
三,面向物件的互動
# 類名開頭是大寫!
class Dog:
def __init__(self, name, blood, aggr, kind):
self.name = name
self.hp = blood
self.aggr = aggr
self.kind = kind
def bite(self, person):
# 狗咬人,人掉血
person.blood -= self.aggr
class Person:
def __init__(self, name, blood, aggr, sex):
self.name = name
self.blood = blood
self.aggr = aggr
self.sex = sex
def attack(self, dog):
dog.hp -= self.aggr
if dog.hp <= 0:
print('%s打了%s,%s被打死了,撲街~~~' % (self.name, dog.name, dog.name))
else:
print('%s打了%s,掉了%s血' % (self.name, dog.name, self.aggr))
jin = Dog('金老闆', 100, 20, 'teddy')
alex = Person('alex', 999, 998, '不詳')
jin.bite(alex) # Dog.bite(jin,alex)
print(alex.blood)
alex.attack(jin) # Person.attack(alex,jin)
print(jin.hp)
輸出結果:
979
alex打了金老闆,金老闆被打死了,撲街~~~
-898
四,實戰部分
1,練習題一
# 練習一:在終端輸出如下資訊
#
# 小明,10歲,男,上山去砍柴
# 小明,10歲,男,開車去東北
# 小明,10歲,男,最愛大保健
# 老李,90歲,男,上山去砍柴
# 老李,90歲,男,開車去東北
# 老李,90歲,男,最愛大保健
# 老張…
# 以下兩種情況考慮面向物件:
# 1,當有幾個函式,需要反反覆覆傳入相同的引數的時候,就可以考慮面向物件
# 2,非常明顯的處理一類事物,這些事物都有相似的屬性和功能
class Person:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def shangshan(self):
print('%s,%s歲,%s,上山去砍柴' % (self.name,self.age,self.sex))
def drive(self):
print('%s,%s歲,%s,開車去東北' % (self.name,self.age,self.sex))
def favor(self):
print('%s,%s歲,%s,最愛大保健' % (self.name,self.age,self.sex))
ming = Person('小明', '10', '男')
ming.shangshan()
ming.drive()
ming.favor()
zhang = Person('老張', '90', '男')
zhang.shangshan()
zhang.drive()
zhang.favor()
輸出結果:
小明,10歲,男,上山去砍柴
小明,10歲,男,開車去東北
小明,10歲,男,最愛大保健
老張,90歲,男,上山去砍柴
老張,90歲,男,開車去東北
老張,90歲,男,最愛大保健
2,練習題二
# 求周長和麵積
from math import pi
class Circle:
def __init__(self, r):
self.r = r
def area(self):
return pi*(self.r**2)
def perimeter(self):
return 2*pi*self.r
c1 = Circle(6)
print(c1.area())
print(c1.perimeter())
輸出結果:
113.09733552923255
37.69911184307752