2016-07-12 3 views
0

J'ai plusieurs classes dans ce projet qui sont toutes confrontées à la même situation que je vais expliquer. Pour simplifier les choses, je vais utiliser une classe et les détails de sa situation spécifique.OOP Python - initialisation de variables membres à partir de paramètres constructeur ou de fonctions membres?

Classe

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

Way To Go À propos de ce # 1

je pouvais construire des instances avec les variables membres remplies par les paramètres du constructeur. Cela se fera en ayant des fonctions séparées à l'extérieur de la classe au sein de la main qui obtient les informations nécessaires.

def main(): 

    mac_address = get_mac_address() 
    ip_address = get_ip_address() 

    Device0 = ConnectedDevice(mac_address, ip_address) 

Way To Go À propos de ce # 2

je pouvais construire des instances avec None dans les paramètres du constructeur et d'utiliser les fonctions membres après le fait de remplir les variables membres. Évidemment, j'aurais défini les fonctions des membres dans ma classe pour le faire.

def main(): 

    Device0 = ConnectedDevice(None, None) 

    Device0.set_mac_address() 
    Device0.set_ip_address() 

Question

Je demande qui est la meilleure façon orientée objet pour aller à ce sujet?

  • Way To Go À propos de ce # 1
  • Way to Go À propos de ce # 2

Répondre

1

est-ce pas plus une question d'opinion? Je dirais que «Way to Go About this # 2» est une mauvaise idée parce que le code n'est pas écrit pour être utilisé une seule fois, et qu'un jour vous ou quelqu'un d'autre voudrez utiliser ConnectedDevice et l'utiliser par inadvertance dans uninitialized mode. Même quand vous savez comment cela est censé être fait, vous pouvez glisser.

Quoi qu'il en soit, à mon humble avis une meilleure approche est tout à fait "Way to Go À propos de ce # 3":

def main(): 

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

... et si le constructeur reçoit None pour l'un des arguments, soulever une exception. (Mais c'est mon goût.)