1. 程式人生 > >python3.6入門到高階(全棧) day017 類與類的關係

python3.6入門到高階(全棧) day017 類與類的關係

今日主要內容
類與類之間的關係
依賴關係
在方法中給方法傳遞一個物件. 此時類與類之間的關係是最輕的

例 class ZhiWu:
def __init__(self, name, attack, hp):
self.name = name
self.attack = attack
self.hp = hp

def fight(self, js): # 這裡是依賴關係. 想執行這個動作. 必須傳遞一個js

js.hp -= self.attack # 傳遞來的物件執行運算的動作

class JiangShi:
def __init__(self, name, hp, attack):
self.name = name
self.hp = hp
self.attack = attack

def chi(self, zhiwu):
zhiwu.hp -= self.attack


lvluo = ZhiWu("綠蘿", 20, 10)
js1 = JiangShi("殭屍一號", 100, 5)
lvluo.fight(js1)

js1.chi(lvluo)
print(lvluo.hp)

print(js1.hp)


關聯關係(組合, 聚合)
def __init__(self, name, xxxList =None):
self.xxxList = xxxList

def __init__(self, name, teacher):

self.teacher = teacher

一對多. 一的一方埋集合
多的一方埋實體

例 class Teacher:
def __init__(self, name, lst=None):
self.name = name
if lst == None: # 判斷傳遞過來的引數是否是空
self.lst = []
else: # 傳遞過來的是一個列表
self.lst = lst

# 新增學生
def tianjia(self, student):
self.lst.append(student)

def display(self):
for s in self.lst: # s 是老師的學生
print(s.name)


class Student:
def __init__(self, num, name, teacher=None):
self.name = name
self.num = num
self.teacher = teacher

t = Teacher("大張偉")
s1 = Student(1, "郭德綱")
s2 = Student(2, "岳雲鵬")
s3 = Student(3, "張鶴倫")
s4 = Student(4, "朱雲峰")

t.tianjia(s1) # 把學生新增給老師
t.tianjia(s2)
t.tianjia(s4)
#
t.display()

簡單的繼承
self: 誰呼叫的. self就是誰


建立物件的真正步驟:

例 class Car:
def __init__(self, color, pai): # 初始化方法
print("哪有地呀")
self.color = color
self.pai = pai

# 這裡才是真正的構造方法
def __new__(cls, *args, **kwargs):
print("我的天哪")
# 固定的返回值
return object.__new__(cls)

c = Car("紅色", "京A66666") # 先執行__new__ 返回object.__new__(cls).把返回的空物件傳遞給 __init__()

print(c.color)


特殊成員
__init__()
__call__()
__getitem__()
__setitem__()
__delitem__()
__enter__()
__exit__()

__hash__() hash(c)
__len__() len(c)
__iter__()
__add__() +

__new__() 構造方法. 用來建立物件的. 開闢記憶體


     特殊成員
      例  # class Car:
# def __init__(self, color, pai):
# self.color = color
# self.pai = pai
# def __call__(self, *args, **kwargs):
# print("這裡是call")
#
# def __getitem__(self, item):
# print("這裡是getitem, item=", item)
#
# def __setitem__(self, key, value):
# print(key, value)
#
# def __delitem__(self, key):
# print(key)
#
# def __add__(self, other): # 在執行兩個物件相加的時候自動呼叫
# print("證明我來過")
# def __enter__(self):
# print("進來的時候")
# def __exit__(self, exc_type, exc_val, exc_tb):
# print("這裡是出去")
#
# def __str__(self): # 當前物件的字串表示形式
# return "我的車很厲害"
#
# def __repr__(self): # 一個物件的官方字串表示形式
# return "我的車非常非常厲害"
#
# def __iter__(self):
# return (i for i in range(10))
#
# # def __hash__(self):
# # return hash(self.pai) + hash(self.color)
# __hash__ = None
#
#
# c = Car("紅", "1.5T") # 在建立物件的時候會自動的呼叫__init__() 類名() ==> init()
# # c() # 物件() => __call__()
# # c["馬化騰"] # 物件[任意引數] => __getitem__(item)
# # c["胡辣湯"] = "河南開封"
# # del c['上海小混沌大碗']
#
# # c2 = Car("黑色", "1.8T")
# # cc = c+c2
#
# # with c as m: # 裝飾器
# # print("哈哈哈")
# #
# # print("呵呵呵")
# # print(c) # 當列印一個物件的時候. 預設的去執行__str__ 根據__str__返回的結果進行列印
# # print(repr(c))
#
# print("%s" % c) # %s __str__
# print("%r" % c) # %r __repr__
#
# # c > c2 # great than
# # c< c2 # less than
# # c >= c2 # greate and equals
#
# for s in c:
# print(s)