20180724 (面向对象:类的命名空间和查询顺序丶组合)
一.類的名稱空間
類名() ?產生了一個含有對象指針的空間
先執行代碼 從上向下執行?
首先執行到class的時候,創建了一個Person類的空間,其中有靜態變量和方法以及方法的內存地址
之后執行到p1 = Person()的時候,又創建了一個p1的實例空間,當還沒讀到括號里面的參數的時候,此時該實例空間里只有一個指示牌是指向Person類空間的
當執行到括號里面的內容的時候,此時實例空間里多了country = "菲律賓",name = "alex",age = 42,height = 175
?
查詢順序: ?對象.屬性:先從對象(實例)空間里面找,如果找不到,再從類的空間里面找,再找不到,到父類里面找
? 類名.屬性:先從本類空間里面找,如果找不到,就到父類找
?
對象與對象之間是相互獨立的
例如:
如圖代碼.如果p1下面有添加了一行代碼(p2 = Person("美國","wusir","男",38,180)) ? ? ?則當程序執行到p2的時候就又創建了一個p2的實例空間,與p1是相互獨立的,但都有一個指示牌,指向類Person空間
?
例如:
計算一個類,實例化多少個對象
class Person:
count = 0
def __init__(self):
Person.count = Person.count(self.count 在這里是引用) + 1
p1 = Person()
p2 = Person()
p3 = Person()
Person.count = 6 ? ? ? ? ? ? ? ? ? ?======>通過類名可以更改我的類中的靜態變量,但是通過對象,不能改變只能引用類中的靜態變量
print(Person.count)
二.組合 ? ?(給一個類的對象封裝一個屬性,這個屬性是另一個類的對象)
例如:
class Person:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p):
p.hp = p.hp - self.ad
print("%s攻擊了%s,%s掉了%s血,還剩%s血" % (self.name,p.name,p.name,self.ad,p.hp))
def wuqi(self,wea):
self.wea = wea
class Weapons:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def fight(self,p1,p2):
p2.hp = p2.hp - self.ad
print("%s拿%s攻擊了%s,%s掉了%s血,還剩%s血" % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))
p1 = Person("蓋倫",20,150)
p2 = Person("提莫",50,100)
w1 = Weapons("斧子",50)
w2 = Weapons("雙節棍",80)
p1.attack(p2) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?===========>蓋倫攻擊了提莫,提莫掉了20血,還剩80血
p1.wuqi(w1)
p1.wea.fight(p1,p2) ? ? ? ? ? ? ? ? ? ? ? ? ? =======>蓋倫拿斧子攻擊了提莫,提莫掉了50血,還剩30血
?
轉載于:https://www.cnblogs.com/lhy979/p/9362007.html
總結
以上是生活随笔為你收集整理的20180724 (面向对象:类的命名空间和查询顺序丶组合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selenium-webdriver(p
- 下一篇: 谁偷走了程序员的时间??