Vinnaren i pepparkakshustävlingen!
2023-12-27, 00:04
  #2149
Medlem
Citat:
Ursprungligen postat av ladicius
Snabb fråga, varför står en del saker med två underscore framför och efter i din text/kod ('__add__', '__main__' osv)?

Din fråga är inte direkt en nybörjarfråga, ironiskt nog. Vi säger så här; allt du gör i Python handlar om objekt. Dessa objekt kallas klasser. Varje klass har olika egenskaper och sätt att vara, sk. metoder. En metod är just en funktion inom ett objekt som instruerar objektet att göra en viss sak. Metoder med __ __() är specialmetoder som finns förbestämda för Python att tolka. __add__() har vi redan gått igenom, den kopplar instruktioner till tecknet "+". __main__() är en instruktion som säger åt Python att fokusera på det objekt som du har valt. Metoden __init__() brukar vara den vanligaste "dundermetoden" då den initierar din klass när du skapar ett objekt.


Men för dig som nybörjare är betydelsen av dessa metoder överkurs. Jag ville poängtera att "+" enbart är en genväg till objektets __add__() och kan fungera olika beroende på objekt. Därför slår man ihop strängar med "ö" + "l" till "öl" samtidigt som man räknar addition med heltal 3 + 4 som är lika med 7. Samma metod ligger bakom "+", men instruktionen i metoden är olika.
Citera
2023-12-27, 09:12
  #2150
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av ladicius
Oj, herregud! Nu fick jag ju ett ännu mer djuplodande svar - jag tackar ödmjukast! Det är alltid inspirerande när man får såhär proffsiga svar som nybörjare, så att man verkligen förstår - tack så hemskt mycket för att du tog dig tiden att svara!

Snabb fråga, varför står en del saker med två underscore framför och efter i din text/kod ('__add__', '__main__' osv)?
Nu kan jag inte Python, men det korta svaret är att man har bestämt det. De nämnda funktionerna är sådant som vanliga användare inte ser eller använder, vilket de som utvecklar språket gör. Så antagligen har det helt enkelt bestämts att vissa grundläggande funktioner i ”bakgrunden” har sådana namn. Är man flera som arbetar med samma kod sångare den vara begriplig. Inget hindrar att man istället för
int.___add___()
väljer att kalla det för
h.p()
vilket skulle kunna utläsas ”heltalens plusfunktion.
Citera
2023-12-27, 12:09
  #2151
Medlem
Citat:
Ursprungligen postat av Neksnor
Nu kan jag inte Python, men det korta svaret är att man har bestämt det. De nämnda funktionerna är sådant som vanliga användare inte ser eller använder, vilket de som utvecklar språket gör. Så antagligen har det helt enkelt bestämts att vissa grundläggande funktioner i ”bakgrunden” har sådana namn. Är man flera som arbetar med samma kod sångare den vara begriplig. Inget hindrar att man istället för
int.___add___()
väljer att kalla det för
h.p()
vilket skulle kunna utläsas ”heltalens plusfunktion.

Nja... För skribentens skulle behöver han bara veta att dundermetoder är metoder inom en klass som sköter "administrativa" saker för klassen. Dessa behöver man oftast inte peta i. Du kan peta i __init__() och __repr__() vilka är två dundermetoder som du ofta skriver över i din klass. Det __repr__ gör är att skriva ut en sträng med fullständigt namn etc. om klassen.

Med risk för att denna diskussion blir för svår för nybörjare:
Dundermetoderna för klasser fyller ett specifikt syfte för Pythons tolk. Dessa brukar ofta ha ärvt från klassen Object och har då olika färdigskrivna metoder för saker som bara måste ske såsom att initiera attribut när en klass initieras. Det görs med __init__(). Samtidigt är __add__() kopplat till "+" och ger detta tecken en instruktion när Python ser att du har "+" mellan två klasser/objekt.

Tar du t.ex.
Kod:
if __name__ =="__main__":

Dundermetoden __name__ pekar här på pythonmodulen, dvs filnamnet på den fil som Python kör. Mendan dundermetoden __main__ pekar på filens top-namespace, dvs filens globala högsta objekt som Python körs på i filen.

Alla klasser och funktioner i en modul finner sin adress genom __main__.Klass.

ex
Kod:
>>> class r:
...     e:int
>>> r
<class '__main__.r'>

Om filnamnet är lika med namnet på top-namespace så vet Python att koden körs direkt i filen. Är __name__ skilt från "__main__" så vet Python att objektet den kör är importerat från en annan fil.

https://docs.python.org/3/library/__...odule-__main__

Du skulle kunna skriva en egen metod __main__.klass.p() som identifierar tecknet "+" och gör saker du vill. Men varför göra det när du kan ärva Object och använda dess __add__() för att identifiera "+" och sedan skriva över metoden i din egen klass så att den gör det du vill göra?
Citera
2024-03-07, 15:00
  #2152
Medlem
176-761s avatar
Hej

Här är mitt python-script, den ligger i en fil som heter morse_test.py, och jag har det på en raspberry pi 3 (första modellen/upplagan/varianten), där jag kör ett fullt uppdaterat raspberr pi os legacy lite. Jag kopplar upp mig på pin genom ssh och skriver i nano. Filen är gjord körbar genom "sudo chmod +x morse_test.py", och det ger ingen skillnad om jag kör filen genom "./morse_test.py" eller "sudo morse_test.py"


Kod:
import time

class LEDController:
    
base_time 0.1  # 1/10th of a second
    
dot base_time
    dash 
dot
    pause_in_character 
dot
    pause_in_word 
dot
    pause_between_word 
dot

    
@staticmethod
    def on
():
        
with open('/sys/class/leds/ACT/brightness''w') as file:
            
file.write('1')

    @
staticmethod
    def off
():
        
with open('/sys/class/leds/ACT/brightness''w') as file:
            
file.write('0')

    @
staticmethod
    def print_dot
():
        
LEDController.on()
        
time.sleep(LEDController.dot)
        
LEDController.off()

    @
staticmethod
    def print_dash
():
        
LEDController.on()
        
time.sleep(LEDController.dash)
        
LEDController.off()

    @
staticmethod
    def print_space
():
        
time.sleep(LEDController.pause_in_word)
        
    @
staticmethod
    def flash_led
(input_string):
        for 
char in input_string:
            if 
char == '.':
                
LEDController.print_dot()
                
time.sleep(LEDController.pause_in_character)
            
elif char == '-':
                
LEDController.print_dash()
                
time.sleep(LEDController.pause_in_character)
            
elif char == ' ':
                
LEDController.print_space()
 
#           time.sleep(LEDController.pause_in_word)




# Get user input
user_input input("Enter your Morse code: ")

# Process the user input
LEDController.flash_led(user_input

Jag får följande felmeddelande:

Kod:
./morse_test.py: rad 1: import: kommandot finns inte
./morse_test.py: rad 3: class: kommandot finns inte
./morse_test.py: rad 4: base_time: kommandot finns inte
./morse_test.py: rad 5: dot: kommandot finns inte
dash: 0: cannot open =: No such file
./morse_test.py: rad 7: pause_in_character: kommandot finns inte
./morse_test.py: rad 8: pause_in_word: kommandot finns inte
./morse_test.py: rad 9: pause_between_word: kommandot finns inte
./morse_test.py: rad 11: syntaxfel nära den oväntade symbolen ”(”
./morse_test.py: rad 11: `    def on():'

och jag kan för allt i världen inte komma på vad det är jag ska fixa eller ändra eller vad felet är. Det jag försöker göra är att ta kontrollen över ACT-led: en på pin och styra hur den ska lysa. Jag vill få den att blinka morsekod som jag skickar till den, där . är punkt och - är streck. dot och dash på engelska.

Någon som har något råd?

edit: en sista sak jag kom på. Det fungerar att direkt styra det i bash genom
Kod:
#på
echo 1 | sudo tee /sys/class/leds/ACT/brightness
#av
echo 0 | sudo tee /sys/class/leds/ACT/brightness
__________________
Senast redigerad av 176-761 2024-03-07 kl. 15:11.
Citera
2024-03-07, 15:11
  #2153
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av 176-761
Någon som har något råd?
Enkelt svar :
Alt 1) Kör koden genom python-motorn genom
Kod:
python3 morse_test.py
Alt 2)
Lägg till en hashbang överst i scriptet
Kod:
#!/usr/bin/env python3

Förklaring.
Du har klistrat in en ren python-kod i ditt skript utan instruktion för bash (kommandtolken) att den ska köra koden med Python3-motorn. Då tolkar den din python-kod som bash-kod vilket blir tokigt.
Detta kan du antingen avhjälpa genom en hashbang - en instruktion om vilken motor som resten av koden ska tolkas genom (alt 2) eller genom att uttryckligen kör python-filen med python3 i terminalen (alt 1)
__________________
Senast redigerad av Enterprise 2024-03-07 kl. 15:14.
Citera
2024-03-07, 15:43
  #2154
Medlem
176-761s avatar
Citat:
Ursprungligen postat av Enterprise
Enkelt svar :
Alt 1) Kör koden genom python-motorn genom
Kod:
python3 morse_test.py
Alt 2)
Lägg till en hashbang överst i scriptet
Kod:
#!/usr/bin/env python3

Förklaring.
Du har klistrat in en ren python-kod i ditt skript utan instruktion för bash (kommandtolken) att den ska köra koden med Python3-motorn. Då tolkar den din python-kod som bash-kod vilket blir tokigt.
Detta kan du antingen avhjälpa genom en hashbang - en instruktion om vilken motor som resten av koden ska tolkas genom (alt 2) eller genom att uttryckligen kör python-filen med python3 i terminalen (alt 1)
Tack. Tusen tack. Jag hade på känn att det var något så här nybörjarnivå problem med en nybörjar-nivå-lösning som krävdes... Oj vad dum jag känner mig! Jag lade till shebanget och det gjorde biffen. Men vad är skillnaden mellan #!/usr/bin/env python3, #!/usr/bin/python (eller #!/usr/bin/python3)?

Tack, nu koda vidare och se vad nästa problem dyker upp är
Citera
2024-03-07, 16:12
  #2155
Medlem
Citat:
Ursprungligen postat av 176-761
Tack. Tusen tack. Jag hade på känn att det var något så här nybörjarnivå problem med en nybörjar-nivå-lösning som krävdes... Oj vad dum jag känner mig! Jag lade till shebanget och det gjorde biffen. Men vad är skillnaden mellan #!/usr/bin/env python3, #!/usr/bin/python (eller #!/usr/bin/python3)?

Tack, nu koda vidare och se vad nästa problem dyker upp är

Ja, du....

Nybörjarsvar:

Eftersom Python inte är ett kompilerat språk kan du inte direkt köra Python som du kan med t.ex. C. Därför måste du kalla på Pythons "tolkare" för att tolka koden. Givetvis finns det sätt att förkompilera Python och köra koden som .exe eller som .c eller vad som.

Env-epitetet är en förkortning för python enviroment, vilket är en emulator som gör att du inte behöver köra moduler direkt i OS-systemet. Den är egentligen till för 1)linux, som kör python inbyggt 2) ifall du vill köra opålitliga moduler. Vissa anser att det är kutym att köra bin/env python just för att slippa kontaminera systemets pythonmoduler med tredjepartsinstallationer. MEN, env python kommer med sina bakdelar och är inte direkt användarvänligt. Bla. brukar IDEs konstra sig när motorn i IDEn inte kan köra koden med moduler som ligger i env. Inte nybörjarvänligt alls.
https://docs.python.org/3/library/venv.html

#!/usr/bin/env python3 säger till bash att den skall starta ditt program i python enviroment.

#!/usr/bin/python3 säger till bash att starta programmet med det python som är inbyggt i OS.

"python" är själva grundkommandot för Python. Den ska egentligen peka på just den version som finns direkt i OS. För vissa är det fortfarande Python version 2, vilket gör att man då kan direkt köra Python version 3.6+ med python3.
Du kan välja att köra Python 3.10, Python4 också. Min linuxdist kör python 3.10 med <<python>>.

När vi ändå är i "nybörjarstadiet", varför deklarerar du en klass utan att använda klassernas potential? Behöver rappie ha alla funktioner sorterade under en klass? Om inte, kan du köra dina @staticmethods just som vad de är nu, dvs FUNKTIONER utan klasstillhörighet.

Sedan trodde jag att du gjorde en signalteknisk morse-dekoder, men du gör ju bara discoljus med LED.
Citera
2024-03-07, 21:57
  #2156
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Methos
Env-epitetet är en förkortning för python enviroment, vilket är en emulator som gör att du inte behöver köra moduler direkt i OS-systemet.
Emulator? Är inte bara env en förkortning för enviroment, alltså vilka miljövariabler som python-sessionen "ärver"?
Citera
2024-03-07, 22:02
  #2157
Medlem
Citat:
Ursprungligen postat av Enterprise
Emulator? Är inte bara env en förkortning för envirorement, alltså vilka miljövariabler som python-sessionen "ärver"?

Nja, det är mer en virtuell container. Kör du en pip install i en venv så får du bara modulerna där.
venv utvecklades just för att kollisionen mellan python2 och python3 i gamla linuxdistar blev för stor.
Vissa moduler behövde uppdatera vissa systemkritiska pythonmoduler och det kunde låsa upp hela OSet om det var fel systemkritiska moduler som "uppdaterades" när man installerade tredjepartsmoduler direkt i OSet.
Citera
2024-03-08, 14:14
  #2158
Medlem
176-761s avatar
Citat:
Ursprungligen postat av Methos
Ja, du....

Nybörjarsvar:

Eftersom Python inte är ett kompilerat språk kan du inte direkt köra Python som du kan med t.ex. C. Därför måste du kalla på Pythons "tolkare" för att tolka koden. Givetvis finns det sätt att förkompilera Python och köra koden som .exe eller som .c eller vad som.

Env-epitetet är en förkortning för python enviroment, vilket är en emulator som gör att du inte behöver köra moduler direkt i OS-systemet. Den är egentligen till för 1)linux, som kör python inbyggt 2) ifall du vill köra opålitliga moduler. Vissa anser att det är kutym att köra bin/env python just för att slippa kontaminera systemets pythonmoduler med tredjepartsinstallationer. MEN, env python kommer med sina bakdelar och är inte direkt användarvänligt. Bla. brukar IDEs konstra sig när motorn i IDEn inte kan köra koden med moduler som ligger i env. Inte nybörjarvänligt alls.
https://docs.python.org/3/library/venv.html

#!/usr/bin/env python3 säger till bash att den skall starta ditt program i python enviroment.

#!/usr/bin/python3 säger till bash att starta programmet med det python som är inbyggt i OS.

"python" är själva grundkommandot för Python. Den ska egentligen peka på just den version som finns direkt i OS. För vissa är det fortfarande Python version 2, vilket gör att man då kan direkt köra Python version 3.6+ med python3.
Du kan välja att köra Python 3.10, Python4 också. Min linuxdist kör python 3.10 med <<python>>.

När vi ändå är i "nybörjarstadiet", varför deklarerar du en klass utan att använda klassernas potential? Behöver rappie ha alla funktioner sorterade under en klass? Om inte, kan du köra dina @staticmethods just som vad de är nu, dvs FUNKTIONER utan klasstillhörighet.

Sedan trodde jag att du gjorde en signalteknisk morse-dekoder, men du gör ju bara discoljus med LED.
En sak i taget, en sak i taget. Raspberry Pi behöver inte ha det sorterat under en klass, den kör en vanlig version av python, dock med att den sen ett par år tillbaka kommer med en färdig modul för att hantera GPIO-stiften (RPI.GPIO). Den modulen är sen bara att importera. Mitt mål är att göra ett program som läser av inputen från en pin, och både tolkar den till bokstäver/tecken som returneras så det kan användas i andra program eller senare i programmet, SAMTIDIGT som den visar med hjälp av en led vad det är den får in. I brist på att den hårdvara (sladd, led, knapp) jag beställt ska levereras så försöker jag ändå komma igång med det jag kan. Som att lära mig koda i python.

Vad skulle du säga det är för extra potential jag kan få ur klasserna? Jag tänker mig att i den färdiga klassen så kan jag redan vid initieringen av en instans skicka med vilken led och vilken knapp den ska använda (dvs vilka stift de sitter på), och sedan kunna både starta och sluta lyssnandet på knappen och dessutom skicka fram att den ska byta stift.

Låter det rimligt?
Citera
2024-03-08, 16:10
  #2159
Medlem
Citat:
Ursprungligen postat av 176-761
Vad skulle du säga det är för extra potential jag kan få ur klasserna? Jag tänker mig att i den färdiga klassen så kan jag redan vid initieringen av en instans skicka med vilken led och vilken knapp den ska använda (dvs vilka stift de sitter på), och sedan kunna både starta och sluta lyssnandet på knappen och dessutom skicka fram att den ska byta stift.

Låter det rimligt?

Precis så kan du använda objekt/klasser. Tänk på att Python redan är objektorienterat då allt du gör i Python är objekt/klasser. Men att deklarera en klass och sedan använda @staticmethod gör bara att klassen blir en platshållare för vanliga funktioner, istället för att låta LEDController just vara en controller som håller koll på alla LED och dess funktioner. I den klassen hade jag hämtat info från chipet, hämtat input från GPIO och kontrollerat LEDoutput, genom att just använda controllern som en instans av en controller.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback