Python Class vs Variabili a livello di file

1

Ho la seguente classe:

import Radar

class Domain(Radar):
    URL = 'https://mxtoolbox.com/DNSLookup.aspx'
    ADDRESS_KEYS = ('mailing_address', 'city_name', 'state_name', 'zip_code',
                    'country_name')
    GENERAL_PARAMS = {'format': 'json'}
    BALANCE_PARAMS = {**Radar.GENERAL_PARAMS, 'account': 'balance'}
    SUCCESSFUL_QUERY = 1
    API_KEY_ERROR_REASON = 'Invalid API Key'
    MASKED_ENTITY_INDICATOR = 'To View Unmasked Data'

    def __init__(self, *args, **kwargs):
        self.entity_title = 'Crawling'
        super().__init__(*args, **kwargs)

I metodi di classe (solo loro) accedono a ciascuno di questi membri statici costanti alcune volte.

Quali sono i vantaggi / svantaggi di inserire queste variabili nello scope esterno (come variabili a livello di file - e non in variabili statiche di livello di classe)?

Anche se so che entrambi gli approcci funzionerebbero, mi chiedo dove sia il posto migliore per inserire le variabili - all'interno della classe o sopra di esso.

L'altra opzione:

import Radar

URL = 'https://mxtoolbox.com/DNSLookup.aspx'
ADDRESS_KEYS = ('mailing_address', 'city_name', 'state_name', 'zip_code',
                'country_name')
GENERAL_PARAMS = {'format': 'json'}
BALANCE_PARAMS = {**Radar.GENERAL_PARAMS, 'account': 'balance'}
SUCCESSFUL_QUERY = 1
API_KEY_ERROR_REASON = 'Invalid API Key'
MASKED_ENTITY_INDICATOR = 'To View Unmasked Data'

class Domain(Radar):
    def __init__(self, *args, **kwargs):
        self.entity_title = 'Crawling'
        super().__init__(*args, **kwargs)
    
posta Infinity 14.05.2018 - 11:54
fonte

1 risposta

1

Questa è una scelta per lo più stilistica. Alla fine, non importa. Ci sono alcune differenze più sottili a seconda di come vengono utilizzati.

  • Se le costanti vengono utilizzate solo all'interno del modulo, utilizzare le variabili a livello di modulo è più conveniente. (Confronta le variabili di classe di seguito).

  • Se le costanti vengono utilizzate al di fuori di questo modulo, le variabili a livello di modulo hanno il vantaggio che puoi import di esse.

  • Le variabili di classe hanno il vantaggio di essere raggruppate in quella classe. Questo può fornire un'interfaccia più comoda perché non devi passarli individualmente. Ad esempio, la classe Enum funziona correttamente. Ma al contrario: perché dovresti raggrupparli a meno che non vengano usati insieme?

Le variabili di classe in Python hanno alcuni trucchi.

  • Python non ha costanti vere, quindi chiunque potrebbe riassegnarle. (Per creare campi di sola lettura in Python, devi usare property o più in generale: il protocollo descrittore).
  • Queste variabili possono essere ombreggiate da sottoclassi o da variabili di istanza.
  • È possibile accedere alle variabili solo attraverso la classe o le sue istanze. Per esempio. per accedere alla variabile URL in un metodo, devi dire Domain.URL o self.URL . È possibile accedere direttamente alle variabili a livello di modulo.

In generale, Python non ti obbliga a inserire tutto in una classe. Dovresti usare questa libertà perché la maggior parte delle variabili o funzioni non appartengono a una classe. In caso di dubbio, usa variabili / funzioni libere invece di campi / metodi all'interno di una classe. Puoi sempre cambiare idea in seguito e refactoring.

    
risposta data 15.05.2018 - 16:53
fonte

Leggi altre domande sui tag