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
namedtuple
moeten zijn, niet eenclass
, 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
@classmethod
zijn. - 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
@staticmethod
van te maken. - Als een
class
maar éé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.