攝影:產品經理
蠟燭上面的跑馬燈
在寫 Python 代碼的時候,你們可能會在不知不覺中使用一些設計範式。咱們來看兩個例子。編程
假設有一個類People:ide
class People: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def dance(self): print('我在跳舞') def study(self): print('我在學習') def eat(self): print('我在吃東西') 如今咱們有另外一個類Cla***oom: class Cla***oom: def __init__(self, size): self.size = size self.student = People('小明', 17, '男') def start_class(self): self.student.study()
咱們在Cla***oom的構造函數中,初始化了一個 student 對象,而後在start_class方法中,調用了這個對象的study方法。函數
這個過程看起來彷佛沒有什麼問題,相信不少讀者也是這樣寫代碼的。學習
如今,咱們再增長兩個類:設計
class Restaurant: def __init__(self, name): self.name = name self.consumer = People('張三', 30, '男') def start_launch(self): self.consumer.eat()
class Ballroom: def __init__(self, address): self.address = address self.dancer = People('小紅', 20, '女') def open(self): self.dancer.dance()
新增長的兩個類Restaurant和Ballroom的構造函數裏面都經過People類初始化了對象。而後在調用這個對象的方法。code
這樣寫看起來沒有問題,能正常工做,代碼也不醜。對象
如今,People類須要修改一下它的構造函數:blog
class People: def __init__(self, name, age, sex, address): self.name = name self.age = age self.sex = sex def dance(self): print('我在跳舞') def study(self): print('我在學習') def eat(self): print('我在吃東西')
在初始化People類時,須要傳入一個address參數。如今怎麼辦?產品
因而Cla***oom、Restaurant、Ballroom這三個類的構造函數都要隨之作修改,全都得加上這個address參數。it
這就叫作牽一髮而動全身。
不少人爲了不作這樣的修改,會把新增長的這個參數address改爲默認參數:
class People: def __init__(self, name, age, sex, address=''): self.name = name self.age = age self.sex = sex def dance(self): print('我在跳舞') def study(self): print('我在學習') def eat(self): print('我在吃東西')
這樣看起來,另外三個類的代碼就不須要作任何修改了。
這就是爲何大家公司的代碼裏面,不少函數會帶上大量奇奇怪怪的默認參數的緣由。」
在編程範式中,有一個術語叫作依賴注入,就是爲了解決這個問題的。
並且作起來簡單到你以爲這是在逗你,把People初始化之後的對象傳到其餘類的構造函數中便可:
class Ballroom: def __init__(self, address, dancer): self.address = address self.dancer = dancer def open(self): self.dancer.dance() dancer = People('小紅', 20, '女') ballroom = Ballroom('xxx', dancer) ballroom.open()
雖然叫作編程範式,但也不是說應該始終使用依賴注入。例如你的代碼會層層調用,難道從第一層把對象一層一層傳到最裏面去?因此應該根據實際狀況來進行選擇。