Înțelegerea principalelor metode de python

Eu sunt nou la Python, dar am experiență în alte OOP limbi. Cursul meu nu explică metoda principală în python.

Te rog spune-mi cum principala metodă funcționează în python ? Sunt confuz, pentru că am încercat să-l compara cu Java.

def main():
# display some lines

if __name__ == "__main__": main()

Cum este principalul executat și de ce am nevoie de acest ciudat "dacă" să execute "principal". Codul meu este reziliat fără ieșire, când am elimina "dacă".

Codul minim -

class AnimalActions:
    def quack(self): return self.strings['quack']
    def bark(self): return self.strings['bark']

class Duck(AnimalActions):
    strings = dict(
        quack = "Quaaaaak!",
        bark = "The duck cannot bark.",
    )

class Dog(AnimalActions):
    strings = dict(
        quack = "The dog cannot quack.",
        bark = "Arf!",
    )

def in_the_doghouse(dog):
    print(dog.bark())

def in_the_forest(duck):
    print(duck.quack())

def main():
    donald = Duck()
    fido = Dog()

    print("- In the forest:")
    for o in ( donald, fido ):
        in_the_forest(o)

    print("- In the doghouse:")
    for o in ( donald, fido ):
        in_the_doghouse(o)

if __name__ == "__main__": main()
Comentarii la întrebare (4)
Soluția

Python abordare a "principal" este aproape unic la limba(*).

Semantica sunt un pic mai subtile. Anii __name__ identificator este legat de numele orice modul cum se's a fi importate. Cu toate acestea, atunci când un fișier este executat apoi __name__ este setat la "__principal__" (literal șir de caractere: __principal__).

Acest lucru este aproape întotdeauna folosit pentru a separa partea de cod care trebuie să fie executate din porțiuni de cod care definește funcționalitatea. Deci codul Python conține adesea o linie de genul:

#!/usr/bin/env python
from __future__ import print_function
import this, that, other, stuff
class SomeObject(object):
    pass

def some_function(*args,**kwargs):
    pass

if __name__ == '__main__':
    print("This only executes when %s is executed rather than imported" % __file__)

Folosind această convenție o poate avea un fișier defini clase și funcții pentru utilizare în alte programe, și include, de asemenea, codul pentru a evalua numai atunci când fișierul este numit ca un scenariu independent.

L's important să înțelegem că toate codul de mai sus if __name__ linie în curs de execuție, evaluate, în ambele cazuri. L's evaluată de către interpret, atunci când fișierul este importat sau când l's-a executat. Dacă ai pus un "print" declarație înainte de if __name__ linie, apoi se va imprima de ieșire de fiecare dată orice alt cod de încercări pentru a importa ca un modul. (Desigur, acest lucru ar fi anti-social. Don't face asta).

Eu, personal, ca aceste semantica. Se încurajează programatori pentru a separa funcționalitate (definiții) din funcție (de execuție) și încurajează reutilizarea.

În mod ideal, aproape fiecare modul Python poate face ceva util dacă sunat de la linia de comandă. În multe cazuri, acest lucru este folosit pentru administrarea de teste unitare. Dacă un anumit fișier definește funcționalitatea care este util numai în contextul altor componente ale unui sistem, atunci se poate utiliza în continuare __name__ == "__principal__" pentru a izola un bloc de cod care solicită o suită de teste unitare care se aplică la acest modul.

(Daca're nu vor avea nici o astfel de funcționalitate, nici teste unitare decât it's cel mai bun pentru a se asigura că modul de fișier NU este executabil).

Rezumat: dacă nume == 'principalele':` a doua primară cazuri de utilizare:

  • Permite un modul pentru a oferi functionalitate pentru import în alte coduri, în timp ce, de asemenea, furnizarea de util semantica ca un independent script (o linie de comandă înveliș în jurul valorii de funcționalitate)
  • Permite un modul pentru a defini o suită de teste unitare care sunt stocate (în același fișier ca) codul să fie testate și care pot fi executate independent de restul de codebase.

L's destul de comună pentru a def principal(*args) și dacă __ _ _ nume__ == '__principalele__': pur și simplu apel principal(*sys.argv[1:])dacă doriți să definiți principalele într-un mod care's similar cu alte limbaje de programare. Dacă .py fișier este destinat în primul rând pentru a fi folosit ca un modul în alt cod, atunci s-ar puteadef test_module () și test_module () " în " dacă __ _ _ nume__ == '__principalele__:' suite.

  • (Ruby implementează, de asemenea, o caracteristică similară dacă file == $0`).
Comentarii (2)

În Python, executarea NU trebuie să înceapă de la main. Prima linie de "cod executabil" este executată prima.

def main():
    print("main code")

def meth1():
    print("meth1")

meth1()
if __name__ == "__main__":main() ## with if

Ieșire -

meth1
main code

Mai multe pe main() - http://ibiblio.org/g2swap/byteofpython/read/module-name.html

Un modul's __name__

Fiecare modul are un nume și declarații într-un modul pot afla numele modulului. Acest lucru este deosebit de util într-o anumită situație - așa Cum am menționat anterior, atunci când un modul este importat pentru prima dată, blocul principal în care modulul este rulat. Ce se întâmplă dacă vrem să rula bloc numai dacă programul a fost folosit de la sine și nu atunci când a fost importat dintr-un alt modul? Acest lucru poate fi realizat folosind ____ nume atribut al modulului.

Folosind un modul's nume

#!/usr/bin/python
# Filename: using_name.py

if __name__ == '__main__':
    print 'This program is being run by itself'
else:
    print 'I am being imported from another module'

Ieșire -

$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>

Cum Funcționează

Fiecare modul Python-a l's __name__ definite și dacă acest lucru este __principal__, aceasta implică faptul că modulul este condusă de sine stătătoare de către utilizator și putem face corespunzătoare de acțiuni.

Comentarii (3)

Python nu au definit un punct de intrare, cum ar fi Java, C, C++, etc. Mai degrabă, este pur și simplu execută o sursă fișier linie cu linie. Dacă declarație vă permite să creați un "principal" funcție care va fi executată dacă fișierul este încărcat ca "Principal" modul, mai degrabă decât ca o bibliotecă într-un alt modul.

Pentru a fi clar, acest lucru înseamnă că interpretorul Python începe de la prima linie a unui fișier și-l execută. Executare de linii, cum ar fi clasa Foobar: "și" def foobar()` creează nici o clasă sau o funcție și le stochează în memorie pentru o utilizare ulterioară.

Comentarii (3)

Dacă importați modulul (.py) fișier creați acum la un alt script python va nu de a executa codul cadrul

if __name__ == '__main__':
    ...

Dacă tu a alerga script-ul direct de pe consola, va fi executat.

Python nu utilizează sau solicită un main() funcția. Orice cod care nu este protejat de garda vor fi executate la executarea sau importul de module.

Acest lucru este extins la un pic mai mult la python.berkely.edu

Comentarii (0)