Frage

ich eine Klasse, die ein Attribut greifen muss, die in einem anderen gesetzt. Es ist kein Standard-Datentyp though. Hier ist der Code;

class graphics:
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

Was muss ich tun Referenz ist der Bildschirm-Attribut, das ich mit self.screen und lesbar innerhalb dieser Klasse festlegen können ... aber von einer anderen Klasse muss ich einstellen

screen = ?

unter

class graphics:

Was bedeutet das Fragezeichen sein müssen? Ich habe 0, None versucht „“ ... nichts scheint zu funktionieren, ich habe keine Ahnung, welchen Datentyp, pygame Anruf wäre. : S

War es hilfreich?

Lösung

Sie selten, wenn überhaupt, Referenzattribute einer Klasse. Sie verweisen auf Attribute eines Objekts.

(auch Klassennamen sollten groß geschrieben werden: Graphics).

class Graphics:
SCREEN_SIZE = (640, 480)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

Hier ist ein Beispiel des Erhaltens oder ein Attribut eines Objekts zu setzen.

g= Graphics() # create an object
# access the object's instance variables
print "screen", g.screen
g.screen= pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)

Beachten Sie, dass wir ein Objekt (g) aus unserer Klasse (Graphics) erstellt. Wir verweisen nicht auf die Klasse sehr oft überhaupt nicht. Fast die einzige Zeit, ein Klassenname verwendet wird, ist auf Objektinstanzen (Graphics()) zu erstellen. Wir sagen nur selten Graphics.this oder Graphics.that auf Attribute der Klasse beziehen sich.

Andere Tipps

Ich denke, dass eine kurze Erklärung des Unterschieds zwischen Klassen- und Instanzattributen in Python nützlich sein könnte für Sie.

Wenn Sie schreiben Code wie folgt:

class Graphics:
    screen_size = (1024, 768)

Die Klasse Graphics ist eigentlich ein Objekt selbst - ein Klassenobjekt. Weil Sie screen_size in der es definiert, screen_size ist ein Attribut des Graphics Objekt. Sie können sehen, in der folgenden:

assert Graphics.screen_size == (1024, 768)

In Python können diese Klasse Objekte wie Funktionen verwendet werden - nur die Aufrufsyntax verwenden:

g = Graphics()

g ist eine „Instanz“ der Klasse Graphics genannt. Wenn Sie Instanzen einer Klasse zu erstellen, Attribut alle Lookups, die als nächstes an den Attributen der Klasse Objekt nicht aussehen Attribute der Instanz übereinstimmen. Deshalb ist diese Lookup funktioniert:

assert g.screen_size == (1024, 768)

Wenn wir ein Attribut der Instanz mit dem gleichen Namen hinzufügen, jedoch wird die Suche auf der Instanz erfolgreich zu sein, und es muss gehen nicht auf das Klassenobjekt suchen. Sie im Grunde „Maske“ das Wert des Klassenobjekts mit einem Wert direkt auf der Instanz festgelegt. Beachten Sie, dass dieser nicht den Wert des in dem Klassenobjekt Attributs ändern:

g.screen_size = (1400, 1050)
assert g.screen_size == (1400, 1050)
assert Graphics.screen_size == (1024, 768)

Also, was Sie in Ihrer __init__ Methode zu tun ist genau , was wir taten. Oben: ein Attribut der Instanz Einstellung , self

class Graphics:

    screen_size = (1024, 768)

    def __init__(self):
        self.screen_size = (1400, 1050)

g = Graphics()
assert Graphics.screen_size == (1024, 768)
assert g.screen_size == (1400, 1050)

Der Wert Graphics.screen_size überall nach dieser Klassendefinition verwendet werden kann, wie bei der ersten Anweisung assert in dem obigen Schnipsel gezeigt.

Edit: Und vergessen Sie nicht, der Sektion Python Tutorial auf Klassen , die alles abdeckt und mehr.

Es ist wahrscheinlich ein object Typ so

self.screen = object()

funktionieren könnte (Wenn ich Ihre Frage richtig verstanden).

igitt ... PEBKAC.

Ich bin zu C so verwendet, dass ich dich vergesse immer wieder kann mehr als nur außerhalb von defs Prototyp.

neu geschrieben, wie dies und es funktioniert:

class graphics:
SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top