一日一技:爲何年代久遠的 Python 項目裏面那麼多默認參數?

一日一技:爲何年代久遠的 Python 項目裏面那麼多默認參數?

一日一技:爲何年代久遠的 Python 項目裏面那麼多默認參數?

攝影:產品經理
蠟燭上面的跑馬燈
在寫 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()

雖然叫作編程範式,但也不是說應該始終使用依賴注入。例如你的代碼會層層調用,難道從第一層把對象一層一層傳到最裏面去?因此應該根據實際狀況來進行選擇。
一日一技:爲何年代久遠的 Python 項目裏面那麼多默認參數?

相關文章
相關標籤/搜索