python 類與類之間的關系
一、依賴關系(緊密程度最低)
(1)簡單的定義:就是方法中傳遞一個對象。此時類與類之間存在依賴關系,此關系比較低。
(2)實例植物大戰僵屍簡易版
題目要求:創建一個植物,創建一個僵屍
1、植物:名字、血量,攻擊力
2、僵屍:名字、血量、攻擊力
3、植物可以打僵屍,僵屍掉血
4、植物被僵屍咬,植物掉血
# 植物大戰僵屍簡易版 class ZhiWu:#創建植物類 def __init__(self,name,hp,attack):#初始化屬性 self.name=name self.hp=hp self.attack=attack def da(self,js): js.hp-=self.attack class JiangShi:#創建僵屍類 def __init__(self,name,hp,attack):#初始化屬性 self.name=name self.hp=hp self.attack=attack def eat(self,zw): zw.hp -= self.attack # 創建僵屍和植物對象 zw=ZhiWu("紫羅蘭",20,10) js=JiangShi("躺屍",30,5) # 植物攻擊一次 zw.da(js) print(js.hp)#20 # 僵屍攻擊一次 js.eat(zw) print(zw.hp)#15
二、關聯關系(組合、聚合)
1、簡單的定義:兩種事物必須是相互關聯的,在某種特殊情況下是可以更改和更換的 。
2、聚合關系:屬於關聯關系中的特例,重點是xx和xx聚合成的xxx。各個零部件也可以單獨工作。
3、組合關系:組合關系是比較緊密的一種關系,一損俱損。
4、常見格式(一對一或者一對多模式)
def __init__(self,name,xxxlist=None); self.name=name self.xxxlist=xxxlist def __init__(self,name,teacher=None): self.teacher=tercher
5、實例:老師和學生模型(老師對學生是一對多,學生對老師是一對一)
# 創建老師類 老師能選學生 class Teacher: def __init__(self,name,stu_lst=None): self.name=name if stu_lst:# 判斷傳遞過來的參數是否是空 self.stu_lst=stu_lst else: self.stu_lst=[] def tianjia(self,stu):#添加學生功能 self.stu_lst.append(stu.name) def display(self):#顯示老師對應的學生 for i in self.stu_lst: print(i,end=",") # 創建學生類 class Student: def __init__(self,num,name,teacher=None): self.num=num self.name=name self.techer=teacher # 創建1個老師,5個學生 t=Teacher("黃日中") s1=Student(1,"郭德綱") s2=Student(2,"嶽雲鵬") s3=Student(3,"張傑") s4=Student(4,"謝啦") s5=Student(5,"沈騰") # 添加學生 t.tianjia(s1) t.tianjia(s2) t.tianjia(s3) t.tianjia(s4) t.tianjia(s5) # 顯示老師學生列表 t.display()#郭德綱,嶽雲鵬,張傑,謝啦,沈騰,
三、簡單的繼承
核心self:誰調用,self就是誰。
class Base: def __init__(self, num): self.num = num def func1(self): print(self.num) self.func2() def func2(self): print(111, self.num) class Foo(Base):繼承 def func2(self): print(222, self.num) lst = [Base(1), Base(2), Foo(3)] for obj in lst: obj.func2() #結果111 1 111 2 222 3
class UserInfo(object): pass class Department(object): pass class StarkConfig(object): def __init__(self, num): self.num = num def changelist(self, request): print(self.num, request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): #繼承 StarkConfig def changelist(self, request): print(666, self.num) class AdminSite(object): def __init__(self): self._registry = {} #空字典 def register(self, k, v): self._registry[k] = v(k) site = AdminSite() site.register(UserInfo, StarkConfig) site.register(Department, RoleConfig) # site._registry{UserInfo:StarkConfig(UserInfo),Department:RoleConfig(Department)} for k, row in site._registry.items(): row.run() # UserInfo,999 666,Department
四、類裏面的特殊成員
1、類名() 會自動執行__new__(cls,*args,**kwargs) 創建對象,開辟內存
2、類名()會自動執行__init__(self) 對象初始化
3、對象()會自動執行__call__( )
4、對象[key]會自動執行__getitem__( )
5、對象[k]=value 會自動執行 __setitem__( )
6、del 對象[key] 會自動執行 __delitem__( )
7、對象+對象 會自動執行 __add__( )
8、with 對象 as 變量 會自動執行 __enter__( )和__exit__( )
9、幹掉hash __hash__ ==None 對象就不可以hash
10、對象可以叠代 __iter__( )
python 類與類之間的關系