Hoe maak je een utility-klasse correct

Ik heb een bestand dat bedoeld is als een hulpprogrammabestand.
Het bestand moet veel statische methoden bevatten.

Moet ik de methoden binnen een klasse op deze manier definiëren:

#utility.py
class utility(object):
    @staticmethod
    def method1(a,b,c):
        pass
    @staticmethod
    def method2(a,b,c):
        pass

of gebruik het zo (zonder klasse):

#utility.py
def method1(a,b,c):
    pass
def method2(a,b,c):
    pass

Antwoord 1, autoriteit 100%

De tweede optie is de modus operandi in Python. Ik bedoel, als je alleen functies importeert, dan kun je zoiets als dit doen:

from utility import some_func

die uw functie zal importeren.

De beste werkwijze is dat als u alleen statische functies gebruikt, deze dan gewoon in de algemene naamruimte van een aparte module plaatst, dit uw leven een stuk eenvoudiger maakt. Wat je probeert te doen, is objecten maken en ze gewoon invullen met statische methoden. Waarom zou je dit doen als je de functies gewoon in een .py-bestand kunt definiëren?

In feite is wat u probeert te doen isgedaan. Je probeert een aantal goede hulpprogramma’s op te bergen. Nou, python-requests, is een bibliotheek van derden die gewoon wordt aanbeden door de meerderheid van Pythonista’s en doet dit gewoon. Het slaat zijn goede gebruiksfuncties op in een aparte module. Hier is het voorbeeld.


Antwoord 2, autoriteit 66%

Klassen kapselen zowel gegevens als gedrag in, dus als algemene regels:

  • Als je iets hebt met alleen gegevens en geen methoden, zou het waarschijnlijk een namedtuplemoeten zijn, niet een class, tenzij je die gegevens moet wijzigen nadat je ze hebt gemaakt .
  • Als een functie toegang heeft tot instantiegegevens, moet het een methode zijn.
  • Als een functie geen instantiegegevens benadert, maar wel klassegegevens, moet het een @classmethodzijn.
  • Als een functie geen toegang heeft tot instantiegegevens of klassegegevens, zou het een zelfstandige functie moeten zijn, tenzij er een echt dwingende reden is om er een @staticmethodvan te maken.
  • Als een classmaar één methode heeft, of één methode naast __init__(), dan kun en moet je deze vrijwel zeker herschrijven als een functie.
  • li>

Klassen zijn heel gemakkelijk te misbruiken, maar de verleiding om alles in een klas te schuiven moet echt worden vermeden. Je moet ze gebruiken wanneer ze zinvol zijn, en vermijden ze te gebruiken als ze dat niet doen.


Antwoord 3, autoriteit 29%

Hoewel deze vraag een beetje gebaseerd is op meningen, zou ik zeggen dat de tweede beter is. Het vermindert redundantie. Als u de eerste methode gebruikt, moet u het volgende doen:

import utility
utility.utility.method1(...)

of:

from utility import utility
utility.method1(...)

Als je de tweede gebruikt, kun je echter eenvoudig het volgende doen:

import utility
utility.method1(...)

of:

from utility import method1
method1(...)

Als je een klasse maakt die alleen statische methoden bevat, is mijn vraag “waarom heb je de klasse nodig?” Het draagt ​​hier niets positiefs bij.

Other episodes