4-11 對象的交互 命名空間作用域
阿新 • • 發佈:2018-04-11
() out lose play 攻擊 mon style src self.
1,對象的交互
人和狗大戰之交互
class Person: role = ‘person‘ def __init__(self,name,sex,hp,ad): self.name= name self.sex = sex self.hp = hp self.ad = ad def attack(self,dog): print(‘%s攻擊了%s,%s掉了%s滴血‘%(self.name,dog.name,dog.name,self.ad)) dog.hp -= self.adView Codeclass Dog: def __init__(self,name,kind,hp,ad): self.name = name self.kind = kind self.hp = hp self.ad = ad def bite(self,person): print(‘%s咬了%s,%s掉了%s點血‘%(self.name,person.name,person.name,self.ad)) person.hp -= self.ad alex = Person(‘sb‘,‘male‘,45,35) boss_jin = Person(‘金老板‘,‘male‘,34,45) teddy = Dog(‘小虎‘,‘teddy‘,45,50) alex.attack(teddy) print(teddy.hp) teddy.bite(boss_jin) print(boss_jin.hp)
2,命名空間作用域
對象的內存空間中,只存儲對象的屬性,而不存儲方法和靜態屬性。對象能找類。
方法和靜態屬性都存儲在類的內存空間中,為了節省內存,讓多個對象去共享類中的資源。
class Person: role = ‘person‘ def __init__(self,name,sex,hp,ad): self.name = name self.sex = sex self.hp = hp self.ad = ad self.hobby = ‘girl‘#在自己的對象空間加載 def attack(self): print(‘%s發起一次攻擊‘%self.name) alex = Person(‘sb‘, ‘male‘,44,44) boss_jin = Person(‘金老板‘,‘amle‘,60,63) alex.attack() alex.role = ‘dog‘#在自己的對象空間加載alex.role = ‘dog‘ print(alex.__dict__) print(boss_jin.role)#person print(Person.role)#可以看見靜態變量並沒有改變 perso
加載順序:1,類的內存空間,靜態變量,方法。2,對象的內存空間,類對象指針,通過類對象指針找到類。
1,靜態屬性和方法是共存的。對象的屬性是對立的。2,對象使用名字,先找自己的內存空間,再找類的內存空間。
對於靜態屬性的修改,應該使用類名直接修改。調用靜態變量:類名.靜態變量。
class Person: money = 0 def __init__(self,name): self.name = name def work(self): print(self.name,‘工作賺了1000元錢‘) self.money += 1000 father = Person(‘father‘) mother = Person(‘mother‘) father.work() mother.work() print(Person.money)#靜態變量並沒有改變 # father 工作賺了1000元錢 # mother 工作賺了1000元錢 # 0
class Person: money = [0] def __init__(self,name): self.name = name def work(self): print(self.name,‘工作賺了1000元錢‘) self.money[0] += 1000 father = Person(‘father‘) mother = Person(‘mother‘) father.work()
mother.work() print(Person.money)#2000
class Person: money = [0] def __init__(self,name): self.name = name def work(self): print(self.name,‘工作賺了1000元錢‘) self.money = [Person.money[0] + 1000] father = Person(‘father‘) mother = Person(‘mother‘) father.work() mother.work() print(Person.money)#0
寫一個類統計有幾個對象
class Foo: count = 0 def __init__(self): Foo.count += 1 f1 = Foo() f2 = Foo() f3 = Foo() f4 = Foo() f5 = Foo() print(Foo.coun
程序的解耦:
1,當計算的規模足夠大的時候,我們應該在編碼的過程中,讓操作盡量原子化。
2,盡量用返回值代替print.
求 幾個圓的面積(1,3,5,7,9)
from math import pi class Area: def __init__(self,r): self.r = r def circle(self): return pi*self.r*2 def perimeter(self): return pi*self.r**2 for i in range(1,10,2): ci = Area(i) print(ci.circle()) print(ci.perimeter())
練一練
小明,10歲,男,上山去砍柴 小明,10歲,男,開車去東北 小明,10歲,男,最愛大保健 老李,90歲,男,上山去砍柴 老李,90歲,男,開車去東北 老李,90歲,男,最愛大保健 老張…
class Person: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def hobby(self): print(‘%s,%s歲,%s,上山去砍材‘%(self.name,self.age,self.sex)) print(‘%s,%s歲,%s,開車去東北‘%(self.name,self.age,self.sex)) print(‘%s,%s歲,%s,最愛大保健‘%(self.name,self.age,self.sex)) xiao = Person(‘小明‘,‘10‘,‘男‘) li = Person(‘老李‘,90,‘男‘) xiao.hobby() li.hobby()View Code
計算兩個圓環的面積和周長
from math import pi class Area: def __init__(self,out_radius,in_radius): self.out_radius = out_radius self.in_radius = in_radius def perimeter(self): return pi*self.out_radius*2 + pi*self.in_radius*2 def acir(self): return pi*self.out_radius**2 - pi*self.in_radius**2 ci = Area(21,20) print(ci.perimeter()) print(ci.acir()
4-11 對象的交互 命名空間作用域