DOMANDA OOP - python

Tommaso Sala

Utente Attivo
868
140
CPU
Ryzen 3 1200
Dissipatore
Stock
Scheda Madre
A320m-k
HDD
SSD 240GB + HDD 2x500GB
RAM
8gb DDR4
PSU
EVGA 500w
Dopo aver completato un progetto mi sembra di aver acquisito conoscenze tali da approfondire questo linguaggio di programmazione, in particolar modo perché mi sono imbattuto in uno script che mi è sembrato piuttosto complesso da comprendere e che faceva ampio uso delle classi. Vorrei capirne di più, quindi mi rivolgo a voi, anche perché sembra essere la forma di utilizzo del python più efficace e intelligente nei progetti più seri e complessi. Cosa mi consigliate per approfondire?
 

enricovela

Utente Attivo
443
124
CPU
Ryzen 3600
Dissipatore
Thermaltake Water 3.0 240
Scheda Madre
MSI Gaming plus max x470
HDD
970 evo plus;Crucial MX500 1TB; GIGABYTE M.2 PCIe SSD; p300
RAM
16 GB @3000 MHz
GPU
quadro fx 3800
Audio
Audioengine D1
Monitor
LG 32QK500
PSU
Straight power 11 650 W
Case
Cooler Master MB510L
Net
FTTH Tim
OS
Pop!_OS
qui si fa una buona introduzione. Dopo che hai compreso il meccanismo la cosa migliore è fare pratica, trovando un progettino da realizzare.
 
  • Mi piace
Reazioni: Tommaso Sala

Andretti60

Utente Èlite
6,440
5,091
Imparare il concetto di Classe in Python non è difficile, ma usarle senza avere prima bene chiaro il concetto di OOP (object oriented programming) è nocivo. Imparare per esempio (guardando codice trovato su internet) può anche essere deleterio se non si conosce chi lo abbia scritto. C’è un sacco di spazzatura in rete. A volte la gente (anche brava) pubblica codice perché "funziona", ossia serve a un ben preciso scopo, ma non è detto che sia ben scritto.
BTW le classi sono uno dei concetti che sono evoluti parecchio da Python 2 a Python 3, con un miglioramento notevole, ti consiglio di saltare la vecchia notazione (altrimenti impazzisci).
 
  • Mi piace
Reazioni: Tommaso Sala

pabloski

Utente Èlite
2,868
916
ma usarle senza avere prima bene chiaro il concetto di OOP (object oriented programming) è nocivo.

Dovremmo bastonare Guido. L'idea di eliminare i modificatori di accesso, sostituendoli con _ e __ per i membri privati....Mah!

Hai letto dell'ultimo PEP approvato? := per le assegnazioni...mi sono fatto le ossa sul Pascal e quindi...ma non staranno esagerando?
 
  • Mi piace
Reazioni: Andretti60

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Pensare a classi, interfacce e classi astratte (simulate con qualche decoratore), metodi privati (che di fatto non esistono, a prescindere dagli underscore che ci metti davanti)... in Python mi lascia un po' perplesso.
Io uso molto questo linguaggio per far veramente di tutto ma non ho mai sentito il reale bisogno di modellare oggetti se non in qualche caso particolare o di pensare in un questo paradigma (secondo me molto sopravvalutato). Le classi le vedi usate in molte librerie ma spesso l'utilizzo delle stesse passa per chiamate a funzioni mentre gli oggetti sono più spesso usati come delle "super strutture" che hanno un loro stato interno e dei metodi (funzioni) accessori. Non necessariamente programmare a oggetti rappresenta il modo più "intelligente" e avanzato di usare questo linguaggio, anche se probabilmente è il modo più "complesso" :D
Se comunque vuoi approfondire la cosa, consulta la documentazione ufficiale: https://docs.python.org/3/tutorial/classes.html
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
...
Io uso molto questo linguaggio per far veramente di tutto ma non ho mai sentito il reale bisogno di modellare oggetti se non in qualche caso particolare ...
Dipende molto dalle applicazioni. Usare classi e' un modo per tenere il codice piu' pulito e comprensibile, e permette piu' flessibilita' quando si vuole aggiungere qualcosa. Ovvio che se si usa Python solo per scrivere un semplice script usare le classi e' come uccidere una mosca con un cannone

Dovremmo bastonare Guido. ...
:D:D
Si' e' gia' basonato da solo, accorgendosi che molte idee ti Python 2 erano sballate e il modo migliore era di mandarle al macero e ricominciare da zero con Python 3 abbandonando la compatibilita'.
A me piace Python, ma adesso si esagera, lo si vuole utilizzare per TUTTO. C'mon...
 

enricovela

Utente Attivo
443
124
CPU
Ryzen 3600
Dissipatore
Thermaltake Water 3.0 240
Scheda Madre
MSI Gaming plus max x470
HDD
970 evo plus;Crucial MX500 1TB; GIGABYTE M.2 PCIe SSD; p300
RAM
16 GB @3000 MHz
GPU
quadro fx 3800
Audio
Audioengine D1
Monitor
LG 32QK500
PSU
Straight power 11 650 W
Case
Cooler Master MB510L
Net
FTTH Tim
OS
Pop!_OS
Non penso sia un male il fatto che si possa fare di tutto. Non tutti sono programmatori per mestiere o intraprendono un percorso di studi che li porta ad avere una conoscenza a 360° gradi della materia. Io ne sono un esempio. Con python ho avuto la possibilità di poter fare svariate cose sfruttando librerie già belle e fatte, semplici da comprendere ecc.

Un linguaggio facile, con una sintassi semplice ed intuitiva, che non viene dimenticata se non la si usa per un po'. Non è poca roba.
Uno strumento come questo contribuisce ad un'informatica consapevole, che non sia solo la navigazione web sui social e videogame, e che di fatto consente a tutti di programmare ciò che gli serve. Non a caso nelle scuole inglesi è stato scelto proprio python come linguaggio da insegnare ai bambini.

Penso sia questo il motivo per cui ci sono librerie che consentano a tutti di fare un po' di tutto. Se voglio farmi un sistema di domatica(piano piano ci sto lavorando) posso farlo interamente in python. Certo non sarà la soluzione ottimale, però tra il non farlo proprio ed arrangiare un po' preferisco la seconda.
 

Andretti60

Utente Èlite
6,440
5,091
Guarda, io per primo uso Python, ma non lo uso di certo per scrivere un device driver :)
Quello è il problema. La gente si innamora di un linguaggio e si arena con quello, pretendendo di usarlo per scopi per cui non è stato pensato. Ricordiamo, è essenzialmente uno script language, è per quello che io lo uso, non certo per creare algoritmi complessi che richiedono OOP.
 
  • Mi piace
Reazioni: enricovela

enricovela

Utente Attivo
443
124
CPU
Ryzen 3600
Dissipatore
Thermaltake Water 3.0 240
Scheda Madre
MSI Gaming plus max x470
HDD
970 evo plus;Crucial MX500 1TB; GIGABYTE M.2 PCIe SSD; p300
RAM
16 GB @3000 MHz
GPU
quadro fx 3800
Audio
Audioengine D1
Monitor
LG 32QK500
PSU
Straight power 11 650 W
Case
Cooler Master MB510L
Net
FTTH Tim
OS
Pop!_OS
Per i driver mi sembra un po' assurdo.

Questo programmino si può definire ad OOP? O sto facendo un uso improprio delle calssi? Giusto per capire, visto che non sono del mestiere

Python:
import matplotlib.pyplot as plt

handles = []

def main():
    a = Ideale(290,1200)
    Plot()

def Plot():
    plt.legend(handles)
    plt.show()

class Rendimento:
    def __init__(self, T_1, T_3, k =1.40):
        self.T_1 = T_1
        self.T_3 = T_3
        self.k = k
        self.theta = (T_3/T_1)
        self.rendimento = []
        self.beta = []
        self.P_1 = 0.987
        self.LB = ((self.k-1)/(self.k))
        self.P_2 = 0.987
        self.i = 0

    def R_plot(self):

        plt.ylabel('Rendimento')
        plt.xlabel('Beta')
        plt.grid(color='black', linestyle='-', linewidth=0.2)
        plt.plot(self.beta, self.rendimento)
        self.stringa = self.classe+"  "+self.tipo+r"  $T_{3}=$"+str(self.T_3)
        handles.append(self.stringa)


    def Solve(self):
        self.beta_max = self.theta**self.esponente
        while (self.P_2 <= self.beta_max):

            self.P_2 = self.P_2 + self.i**(00.1)
            self.beta.append(self.P_2/0.987)
            self.rendimento.append(self.Rendimento(self.i))
            if (self.rendimento[self.i] < 0):
                break
            self.i = self.i+1

class Ideale(Rendimento):
    def __init__(self,T_1,T_3,k =1.40, R = False):
        Rendimento.__init__(self,T_1, T_3,k)
        self.classe = "Id."
        self.R = R
        if (self.R == False):
            self.tipo = "Base k="+str(self.k)
            self.esponente = (1/self.LB)
            self.Rendimento = lambda i: 1-(1/(self.beta[i]**self.LB))

        if (self.R == True):
            self.tipo = "Rig. "
            self.esponente = (1/(2*self.LB))
            self.Rendimento = lambda i: 1-((self.beta[i]**self.LB)/self.theta)


        self.Solve()
        self.R_plot()

class Reale(Rendimento):
    def __init__(self,T_1,T_3, k = 1.40, eta_c = 0.88, eta_t = 0.88, R = 0, beta_tot = 0):
        Rendimento.__init__(self,T_1, T_3)
        self.classe = "Re."
        self.k = k
        self.R = R
        self.beta_tot = beta_tot
        self.eta_c = eta_c
        self.eta_t = eta_t
        self.Rendimento = lambda i: self.Lavoro(i)/self.Calore(i)
        if (self.R >= 0.1):
            self.tipo = "Rig. R="+str(self.R)
            self.esponente = (self.eta_c/(self.LB*(1+(self.eta_c*self.eta_t))))

        if (self.beta_tot != 0):
            self.tipo = "Intercooler"
            self.esponente = (1/self.LB)

            self.Lavoro = lambda i: self.theta*(1-((1)/(self.beta_tot**(self.LB*self.eta_t))))-(((self.beta_tot)/(self.beta[i]))**((self.LB)/(self.eta_c))-1)-(self.beta[i]**((self.LB)/(self.eta_c))-1)
            self.Calore = lambda i: self.theta-self.beta[i]**(self.LB/self.eta_c)

        else:
            self.tipo = "Base"
            self.esponente = (1/self.LB)
            self.Lavoro = lambda i: self.theta*(1-(1/(self.beta[i]**(self.LB*self.eta_t))))-self.beta[i]**((self.LB)/(self.eta_c))+1
            self.Calore = lambda i: self.theta*(1-((self.R)/(self.beta[i]**(self.LB*self.eta_t))))-(self.beta[i]**((self.LB)/(self.eta_c)))*(1-self.R)



        self.Solve()
        self.R_plot()


if (__name__ == '__main__'):
    main()
 

Andretti60

Utente Èlite
6,440
5,091
No, non e' assolutamente un uso "improprio", ma quello che hai scritto NON e' OOP, usi le classi semplicementi come se usassi funzioni, tanto per avere un codice ben organizzato, dove tutto viene fatto nel costruttore. La mia NON e' una critica.
 
  • Mi piace
Reazioni: enricovela

enricovela

Utente Attivo
443
124
CPU
Ryzen 3600
Dissipatore
Thermaltake Water 3.0 240
Scheda Madre
MSI Gaming plus max x470
HDD
970 evo plus;Crucial MX500 1TB; GIGABYTE M.2 PCIe SSD; p300
RAM
16 GB @3000 MHz
GPU
quadro fx 3800
Audio
Audioengine D1
Monitor
LG 32QK500
PSU
Straight power 11 650 W
Case
Cooler Master MB510L
Net
FTTH Tim
OS
Pop!_OS
Mi sarebbe andata bene anche una critica ;)


Come mi libero un po' cerco di approfondire la cosa. Quello che chiaramente ho compreso è che il python non è il linguaggio più adatto per questo tipo di avventura.

Stavo pensando di esplorare un po il Java quest'estate. Può essere una buona barca scuola per chi si avvicina all'OOP per la prima volta? Non mi dispiacerebbe evitare gli indirizzi di memoria presenti nel c++
 
  • Mi piace
Reazioni: Andretti60

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili