1. 程式人生 > >4-11 對象的交互 命名空間作用域

4-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.ad

class 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)
View Code

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 對象的交互 命名空間作用域