Programim dhe zhvillim, javascript, python, php, html

pitoni i pavetëmuar

kjo funksionon në mënyrën e dëshiruar:

class d:
    def __init__(self,arg):
        self.a = arg
    def p(self):
        print "a= ",self.a

x = d(1)
y = d(2)
x.p()
y.p()

duke dhënë

a=  1
a=  2

Unë jam përpjekur të eliminoj "veten" dhe të përdor një deklaratë globale në __init__

class d:
    def __init__(self,arg):
        global a
        a = arg
    def p(self):
        print "a= ",a

x = d(1)
y = d(2)
x.p()
y.p()

duke dhënë, në mënyrë të padëshirueshme:

a=  2
a=  2

a ka ndonjë mënyrë për ta shkruar pa përdorur "veten"?

20.04.2011

  • Çfarë po përpiqeni vërtet të arrini? 20.04.2011
  • duke u përpjekur ta bëj kodin tim më të lexueshëm. 20.04.2011
  • Kjo do ta bënte atë a) më pak pitonik dhe b) të thyer. 20.04.2011
  • Sigurisht global a çon në ndarjen e a nga të gjitha rastet. Ky është pothuajse përkufizimi i një ndryshoreje globale. 20.04.2011

Përgjigjet:


1

Metodat Python janë vetëm funksione që janë të lidhura me klasën ose shembullin e një klase. Dallimi i vetëm është se një metodë (aka funksioni i lidhur) pret objektin e shembullit si argumentin e parë. Përveç kësaj, kur thirrni një metodë nga një shembull, ajo automatikisht e kalon shembullin si argumentin e parë. Pra, duke përcaktuar self në një metodë, po i tregoni hapësirën e emrave për të punuar.

Në këtë mënyrë kur specifikoni self.a metoda e di që po modifikoni variablin e shembullit a që është pjesë e hapësirës së emrave të shembullit.

Scoping Python funksionon nga brenda jashtë, kështu që çdo funksion (ose metodë) ka hapësirën e vet të emrave. Nëse krijoni një variabël a në nivel lokal nga metoda p (këta emra thithin BTW), ajo është e dallueshme nga ajo e self.a. Shembull duke përdorur kodin tuaj:

class d:
    def __init__(self,arg):
        self.a = arg
    def p(self):
        a = self.a - 99
        print "my a= ", a
        print "instance a= ",self.a


x = d(1)
y = d(2)
x.p()
y.p()

Që jep:

my a=  -98
instance a=  1
my a=  -97
instance a=  2

Së fundmi, nuk keni pse të thërrisni variablin e parë self. Mund ta quani si të doni, edhe pse në të vërtetë nuk duhet. Është konventë për të përcaktuar dhe referuar self nga brenda metodave, kështu që nëse ju intereson fare që njerëzit e tjerë të lexojnë kodin tuaj pa dashur t'ju vrasin, përmbajuni konventës!

Leximi më tej:

20.04.2011
  • Shpjegim i bukur, terminologji mashtruese në fillim sidoqoftë: ajo që ne e quajmë metodë lidhur tashmë ka shembullin (si argumenti i parë i nënkuptuar), një metodë i palidhur (në Python 2, ajo ka llojin e vet; në Python 3, është thjesht një funksion i thjeshtë, por koncepti ende ekziston) ka ende nevojë për shembullin (si argument i parë i qartë). 20.04.2011
  • kjo ka qenë pyetja ime e parë e postuar. Unë shoh se pyetja është vlerësuar si -1, por nuk jam i sigurt pse. është sepse pyetja është e papërshtatshme për SO? apo paraqitet keq? apo sepse përgjigjet e mia ishin jashtë formatit? 21.04.2011
  • @delnan: Nuk je plotësisht i saktë. Nëse përcaktoni një funksion të zhveshur që merr self si argument të parë, dhe më pas ia caktoni objektit të klasës, çdo shembull i asaj klase do ta trashëgojë atë funksion si një metodë e lidhur. Në këtë rast gjithçka që bëtë ishte të krijoni një funksion, ta bashkëngjitni atë në një klasë dhe u bë një metodë. Sidoqoftë, keni të drejtë në atë që type aktuale e function ndryshon në atë të instancemethod. 21.04.2011
  • @mike: Dikujt nuk i pëlqeu pyetja juaj dhe e votoi kundër. Në përgjithësi është më mirë të jesh më përshkrues në pyetjen origjinale sesa të vazhdosh në komente. :) 21.04.2011
  • Si bie ndesh kjo me gjithçka që thashë? 21.04.2011
  • Imho shpjegimi më i mirë i 'vetes' misterioze për fillestarët. +1 20.04.2017

  • 2

    "vetja" është mënyra se si funksionon Python. Pra përgjigja është: Jo! Nëse dëshironi të shkurtoni flokët: Nuk keni pse të përdorni "vetë". Çdo emër tjetër do të bëjë gjithashtu. ;-)

    20.04.2011
  • ok ... kështu që unë thjesht duhet të mësohem të kem shumë vetë në kodin tim? 20.04.2011
  • @mike: Po, pikë, paragraf i ri. Ju po pyesni pothuajse ekuivalentin Python se si mund ta shmang paraprocesorin në C dhe C++. 20.04.2011
  • shumë varet nga këndvështrimi juaj, por padyshim më shumë se në gjuhët e tjera. Të kesh shumë prej tyre mund të jetë një aluzion se ka një problem me kodin tënd. 20.04.2011
  • E qartë është më e mirë se e nënkuptuar 20.04.2011
  • Shikoni në anën e mirë, nuk do të tundoheni të lidhni m_ në variablat e anëtarëve tuaj vetëm për të sqaruar hapësirat e emrave që aksesohen brenda një metode :) 21.04.2011

  • 3

    Kur hiqni të vetin, përfundoni të keni vetëm një variabël të quajtur a që do të ndahet jo vetëm midis të gjithë objekteve tuaja d por edhe në të gjithë mjedisin tuaj të ekzekutimit. Ju nuk mund të eliminoni vetëm veten për këtë arsye.

    20.04.2011
  • ok, e shoh tani që deklarata globale e ngre variablin në nivelin e ekzekutimit 20.04.2011
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..