class Example(object):
def the_example(self):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Wie greife ich auf die Variable einer Klasse zu? Ich habe versucht, diese Definition hinzuzufügen:
def return_itsProblem(self):
return itsProblem
Das scheitert aber auch.
Antworten:
Die Antwort in wenigen Worten
In Ihrem Beispiel
itsProblem
handelt es sich um eine lokale Variable.Sie müssen verwenden
self
, um Instanzvariablen festzulegen und abzurufen. Sie können es in der__init__
Methode einstellen . Dann wäre Ihr Code:class Example(object): def __init__(self): self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
Wenn Sie jedoch eine echte Klassenvariable wünschen, verwenden Sie den Klassennamen direkt:
class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem) print (Example.itsProblem)
Aber seien Sie vorsichtig mit dieser, da sie
theExample.itsProblem
automatisch gleich gesetzt wirdExample.itsProblem
, aber überhaupt nicht dieselbe Variable ist und unabhängig geändert werden kann.Einige Erklärungen
In Python können Variablen dynamisch erstellt werden. Daher können Sie Folgendes tun:
class Example(object): pass Example.itsProblem = "problem" e = Example() e.itsSecondProblem = "problem" print Example.itsProblem == e.itsSecondProblem
druckt
Genau das machen Sie also mit den vorherigen Beispielen.
In Python verwenden wir zwar
self
alsthis
, aber es ist ein bisschen mehr als das.self
ist das erste Argument für eine Objektmethode, da das erste Argument immer die Objektreferenz ist. Dies erfolgt automatisch, unabhängig davon, ob Sie es anrufenself
oder nicht.Was bedeutet, dass Sie Folgendes tun können:
class Example(object): def __init__(self): self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
oder:
class Example(object): def __init__(my_super_self): my_super_self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
Es ist genau das gleiche. Das erste Argument einer beliebigen Objektmethode ist das aktuelle Objekt. Wir nennen es nur
self
eine Konvention. Und Sie fügen diesem Objekt nur eine Variable hinzu, so wie Sie es von außen tun würden.Nun zu den Klassenvariablen.
Wenn Sie das tun:
class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
Sie werden feststellen, dass wir zuerst eine Klassenvariable festlegen und dann auf eine Objektvariable (Instanzvariable) zugreifen . Wir haben diese Objektvariable nie gesetzt, aber sie funktioniert. Wie ist das möglich?
Nun, Python versucht zuerst, die Objektvariable abzurufen, aber wenn es sie nicht finden kann, erhalten Sie die Klassenvariable. Warnung: Die Klassenvariable wird von Instanzen gemeinsam genutzt und die Objektvariable nicht.
Verwenden Sie daher niemals Klassenvariablen, um Standardwerte für Objektvariablen festzulegen. Verwenden Sie
__init__
dafür.Schließlich werden Sie feststellen, dass Python-Klassen Instanzen und damit Objekte selbst sind, was neue Erkenntnisse zum Verständnis der oben genannten gibt. Komm zurück und lies das später noch einmal, sobald du das merkst.
quelle
theExample.itsProblem
automatisch gleich eingestellt wirdExample.itsProblem
, aber aus praktischer Sicht * überhaupt nicht dieselbe Variable ist und unabhängig geändert werden kann. *: Tatsächlich beginnt es als das gleiche Objekt, aber es ist sehr leicht versehentlich das ändern , wenn Sie Python nicht verstehen Name-BindungSie deklarieren eine lokale Variable, keine Klassenvariable. Verwenden Sie zum Festlegen einer Instanzvariablen (Attribut)
class Example(object): def the_example(self): self.itsProblem = "problem" # <-- remember the 'self.' theExample = Example() theExample.the_example() print(theExample.itsProblem)
Verwenden Sie zum Festlegen einer Klassenvariablen (auch als statisches Element bezeichnet)
class Example(object): def the_example(self): Example.itsProblem = "problem" # or, type(self).itsProblem = "problem" # depending what you want to do when the class is derived.
quelle
Wenn Sie eine Instanzfunktion haben (dh eine, die selbst übergeben wird), können Sie self verwenden, um mithilfe von einen Verweis auf die Klasse abzurufen
self.__class__
Im folgenden Code erstellt Tornado beispielsweise eine Instanz für die Verarbeitung von
get_handler
Abrufanforderungen. Wir können jedoch die Klasse abrufen und damit einen Riak-Client speichern, sodass wir nicht für jede Anforderung eine erstellen müssen.import tornado.web import riak class get_handler(tornado.web.requestHandler): riak_client = None def post(self): cls = self.__class__ if cls.riak_client is None: cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc') # Additional code to send response to the request ...
quelle
Implementieren Sie die return-Anweisung wie im folgenden Beispiel! Du solltest gut sein. Ich hoffe es hilft jemandem ..
class Example(object): def the_example(self): itsProblem = "problem" return itsProblem theExample = Example() print theExample.the_example()
quelle