L'uso di get/set sembra essere una pratica comune in Java (per vari motivi), ma difficilmente vedo il codice Python che usa questo.Usi il modello get/set (in Python)?
Perché si utilizzano o si evitano i metodi get/set in Python?
L'uso di get/set sembra essere una pratica comune in Java (per vari motivi), ma difficilmente vedo il codice Python che usa questo.Usi il modello get/set (in Python)?
Perché si utilizzano o si evitano i metodi get/set in Python?
fredda link: Python is not Java :)
In Java, è necessario utilizzare getter e setter perché usando campi pubblici si dà alcuna possibilità di tornare indietro e cambiare idea in seguito all'utilizzo di getter e setter. Quindi, in Java, potresti anche avere il compito di fare i conti. In Python, questo è sciocco, perché puoi iniziare con un attributo normale e cambiare idea in qualsiasi momento, senza influire sui client della classe. Quindi, non scrivere getter e setter.
più setter/getter aggiungono costi di performance, specialmente in Python. –
Questo * pone * un onere aggiuntivo per il progettista della classe, in quanto le variabili dell'istanza diventano implicitamente parte dell'API pubblica della classe. Quando si crea una classe, si pensi esplicitamente a quali variabili di istanza si desidera accedere esternamente rispetto a quelle che sono realmente solo parte dell'implementazione della classe. Prefix quelli di implementazione interna con un '_' iniziale. Questo è il segnale di avvertimento di Python che se l'implementazione cambia, anche questa variabile potrebbe cambiare o addirittura scomparire completamente. Altrimenti scoprirai che le conoscenze sull'implementazione stanno fuoriuscendo dalla tua classe, rendendo difficile cambiare in seguito. – PaulMcG
@Nick D: Non penso che gli accessor siano il posto giusto per ottimizzare la velocità in Python. – wRAR
No, è unpitonico. Il metodo generalmente accettato consiste nell'usare l'attributo di dati normale e sostituire quelli che richiedono una logica get/set più complessa con le proprietà.
+1: "Siamo tutti adulti qui". Il codice è visibile. "privato" e "getter/setter" non creano alcun valore quando tutto il codice può essere visto. –
Ecco cosa dice Guido van Rossum su che in Masterminds of Programming
Che cosa si intende per "combattere la lingua"?
Guido: Questo di solito significa che sono cercando di continuare le loro abitudini che lavorato bene con una lingua diversa.
[...] La gente trasformare tutto in una classe, e trasformare ogni accesso in un metodo di accesso ,
ove ciò non sia davvero una cosa saggia da fare in Python; avrete più codice dettagliato che è
più difficile da eseguire il debug e viene eseguito molto più lentamente. Conosci l'espressione "Puoi scrivere FORTRAN in qualsiasi lingua?" Puoi scrivere Java anche in qualsiasi lingua.
L'osservazione è corretta. Questo non è uno stile normale di programmazione Python. Gli attributi sono tutti pubblici, quindi è sufficiente accedere (ottenere, impostare, eliminare) come si farebbe con gli attributi di qualsiasi oggetto che li ha (non solo classi o istanze). È facile capire quando i programmatori Java apprendono Python perché il loro codice Python assomiglia a Java usando la sintassi Python!
Sono assolutamente d'accordo con tutti i manifesti precedenti, in particolare @ collegamento di Maximiliano al famoso articolo di Phillip e @ suggerimento di Max che qualcosa di più complesso di quanto il modo standard di impostazione (e ottenere) di classe e l'istanza attributi è quello di utilizzare le proprietà (o Descrittori per generalizzare ancora di più) per personalizzare l'acquisizione e l'impostazione degli attributi! (Questo include l'essere in grado di aggiungere le proprie versioni personalizzate di privati, protetti, amico, o quello che volete, se volete qualcosa di diverso ordine pubblico.)
Come una demo interessante, in Core Python Programming (capitolo 13, sezione 13.16), ho trovato un esempio di utilizzo dei descrittori per archiviare gli attributi su disco invece che in memoria !! Sì, è una strana forma di archiviazione persistente, ma è mostrarvi un esempio di ciò che è possibile!
Ecco un altro post correlati che si possono trovare utili così: Python: multiple properties, one setter/getter
in Python, si può solo accedere all'attributo direttamente perché è pubblico:
class MyClass(object):
def __init__(self):
self.my_attribute = 0
my_object = MyClass()
my_object.my_attribute = 1 # etc.
Se si vuole fare qualcosa in materia di accesso o la mutazione di un attributo, è possibile utilizzare properties:
class MyClass(object):
def __init__(self):
self._my_attribute = 0
@property
def my_attribute(self):
# Do something if you want
return self._my_attribute
@my_attribute.setter
def my_attribute(self, value):
# Do something if you want
self._my_attribute = value
Fondamentalmente, la c il codice lient rimane lo stesso.
La risposta breve alla tua domanda è no, dovresti usare le proprietà quando necessario. Ryan Tamyoko fornisce la risposta a lungo nel suo articolo Getters/Setters/Fuxors
Il valore di base per portare via da tutto questo è che si vuole cercare di assicurarsi che ogni singola riga di codice ha un certo valore o significato per il programmatore. I linguaggi di programmazione sono per gli umani, non per le macchine. Se hai un codice che sembra non fare nulla di utile, è difficile da leggere, o sembra noioso, allora è probabile che Python abbia alcune funzionalità linguistiche che ti consentiranno di rimuoverlo.
Il nostro insegnante ha mostrato un esempio sulla classe di spiegare quando dovremmo usare di accesso funzioni.
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()
Non ti ho dato i downvotes, ma ho pensato di inserirmi. Il punto della discussione è "perché abbiamo bisogno di get()/set() per accedere alle proprietà direttamente in Python". In Java, ci sono linguaggio ... caratteristiche ... che rendono questo desiderabile. In Python, non così tanto. –
Oltre a non rispondere realmente alla domanda, l'esempio utilizzato in questa risposta è offensivo. L'affermazione che il tuo insegnante l'ha usata non giustifica il suo sessismo. – Touzen
Greate risposte da tutti. Certo, questa domanda è una propaggine di questo http://stackoverflow.com/questions/1022970/getters-and-setters-code-smell-necessi-evil-or-cant-live-without-them-clos tuttavia, sembra che sia stato perquisito da un'orda di persone che la guardavano da una prospettiva "J". Grazie ancora per aver ripristinato la mia fiducia nella sanità mentale ... –
Il contesto è importante, e qui Python e Java sono semplicemente diversi. (Tuttavia, ho rimosso Python dal titolo perché usiamo i tag per questo su SO.;) –