ООП Python инициализирует переменные-члены из параметров конструктора или из функций-членов?

У меня есть несколько классов в этом проекте, и все они сталкиваются с одной и той же ситуацией, которую я собираюсь объяснить. Чтобы упростить вещи, я буду использовать один класс и детали его конкретной ситуации.

Класс

class ConnectedDevice(object):
    def __init__(self, mac_address, ip_address):
        self.mac_address = mac_address
        self.ip_address = ip_address

Путь к этому № 1

Я мог создавать экземпляры с переменными-членами, заполненными через параметры конструктора.

Это можно было бы сделать с помощью отдельных функций вне класса внутри main, которые получают необходимую информацию.

def main():

    mac_address = get_mac_address()
    ip_address = get_ip_address()

    Device0 = ConnectedDevice(mac_address, ip_address)

Путь к этому № 2

Я мог бы создавать экземпляры с None в параметрах конструктора и использовать функции-члены постфактум для заполнения переменных-членов. Очевидно, для этого я бы определил функции-члены в своем классе.

def main():

    Device0 = ConnectedDevice(None, None)

    Device0.set_mac_address()
    Device0.set_ip_address()

Вопрос

Я спрашиваю, какой лучший объектно-ориентированный способ сделать это?

  • Способ сделать это # ​​1
  • Путь к этому # 2

person ma77c    schedule 12.07.2016    source источник


Ответы (1)


Разве это не вопрос мнения? Я бы сказал, что «Путь к этому № 2» - плохая идея, потому что код не написан для использования только один раз, и когда-нибудь в будущем вы или кто-то еще может захотеть использовать ConnectedDevice и может использовать его непреднамеренно в неинициализированных мода. Даже когда вы знаете, как это должно быть сделано, вы можете ошибиться.

В любом случае, ИМХО, лучшим подходом в целом является «Путь к этому № 3»:

def main():

    Device0 = ConnectedDevice(get_mac_address(), get_ip_address())

... и если конструктор получает None для любого из аргументов, вызывает исключение. (Но это мой вкус.)

person John Perry    schedule 12.07.2016