1. 程式人生 > >python 類與類之間的關係

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__( )