__init__ differiscono dagli attributi dell'oggetto

1

La seguente definizione di classe è un buon progetto?

class Myclass:
    def __init__(self,num1,num2):
        self.complicated_tree = __class__.object_creator(num1,num2)

    @classmethod
    def tree_creator(cls,num1,num2):
        return num1+num2 #in practice, this functions would be really long
                         #and would return a whole tree of numbers

    #my tree doesn't need all the standard traversing etc. methods, just very few
    #special ones
    def specialized_method1(self): 
        pass

    def specialized_method2(self): 
        pass

Sono un principiante in Python e finora tutti gli argomenti del metodo di classe __init__ erano identici agli attributi dell'oggetto. In questo caso, questo non è più vero, perché questa classe deve contenere oggetti che prima devono essere costruiti in un modo complicato: un tipo speciale di albero che devo prima generare in 20 righe di codice usando num1 e num2 .

Questo definisce un buon design / pratica di una tale classe? O dovrei generare l'intero albero al di fuori della classe, in modo che il metodo __init __ dell'albero sia

    def __init__(self,tree):
        self.tree = tree

e la funzione tree_creator è una funzione separata al di fuori della classe?

    
posta l7ll7 17.01.2018 - 16:09
fonte

2 risposte

4

Se la tua classe richiede che strutture dati complicate funzionino correttamente, allora non c'è nulla di sbagliato nel crearle nella funzione di costruzione - questo aiuta a garantire che le istanze di quella classe non siano mai in uno stato "non ancora utilizzabile" sorprendente che dovresti ricordati di controllare. Se questo richiede al costruttore molto tempo, è proprio così. E non c'è niente di sbagliato con gli argomenti del costruttore che differiscono dai valori dei campi interni.

Se costruire un albero complicato all'interno o all'esterno della classe dipende dallo scopo della classe. Se la classe è specificamente su quell'albero, ad es. una classe che rappresenta il tuo file system, quindi tale codice di solito appartiene alla classe. Se la classe rappresenta qualcosa di totalmente diverso, ma sa come utilizzare una struttura di dati a forma di albero per uno scopo specifico, ad es. un configuratore di prodotto che utilizza un albero decisionale, quindi potrebbe essere più appropriato per costruire l'albero all'esterno della classe, o almeno all'interno di una classe helper annidata.

    
risposta data 17.01.2018 - 16:23
fonte
2

È perfettamente accettabile che gli attributi di un oggetto siano diversi dagli argomenti passati al costruttore utilizzato per creare l'oggetto (il metodo __init__ è un costruttore).

Nelle lingue con sovraccarico, è persino possibile specificare più costruttori che ciascuno accetta un diverso insieme di argomenti, mentre gli attributi dell'oggetto sono sempre gli stessi.

Gli attributi di un oggetto rappresentano lo stato di un oggetto e dovrebbero essere in una forma tale che tutti i metodi e le proprietà dell'oggetto possano essere implementati senza troppi sforzi o calcoli duplicati.

Gli argomenti di un costruttore dovrebbero fornire le informazioni necessarie per creare un oggetto e dovrebbero essere in un formato che sia ragionevolmente conveniente per gli utenti dell'oggetto.

Se c'è una differenza significativa tra le due rappresentazioni, allora il costruttore dovrebbe eseguire i calcoli / le trasformazioni richiesti.

    
risposta data 17.01.2018 - 16:20
fonte