Comment faites-vous un attribut de classe qui n'est pas un type de données standard?

StackOverflow https://stackoverflow.com/questions/379995

  •  22-08-2019
  •  | 
  •  

Question

J'ai une classe qui a besoin de saisir un attribut qui est défini dans un autre. Ce n'est pas un type de données standard bien. Voici le 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"

Ce que je dois faire est l'attribut référence de l'écran, que je peux série avec self.screen et être lisibles dans cette classe ... mais d'une autre classe je dois régler

screen = ?

sous

class graphics:

Qu'est-ce que la marque de question doivent être? Je l'ai essayé 0, None « » ... rien ne semble fonctionner, je ne sais pas quel type de données qui appel pygame serait. : S

Était-ce utile?

La solution

Vous rarement, sinon jamais, les attributs de référence d'une classe. Vous faites référence à des attributs d'un objet.

(De plus, les noms de classe doivent être en majuscules: 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"

Voici un exemple d'obtenir ou de définir un attribut d'un objet.

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)

Notez que nous avons créé un objet (g) de notre classe (Graphics). Nous ne fait pas référence à la classe très souvent du tout. Presque la seule fois un nom de classe est utilisé est de créer des instances d'objet (Graphics()). Nous disons rarement Graphics.this ou Graphics.that de se référer aux attributs de la classe elle-même.

Autres conseils

Je pense qu'une brève explication de la différence entre les attributs de classe et par exemple en Python pourrait vous être utile.

Lorsque vous écrivez du code comme ceci:

class Graphics:
    screen_size = (1024, 768)

La Graphics de classe est en fait un objet lui-même - un objet de classe. Parce que vous avez défini screen_size à l'intérieur de celui-ci, screen_size est un attribut de l'objet Graphics. Vous pouvez le voir dans ce qui suit:

assert Graphics.screen_size == (1024, 768)

En Python, ces objets de classe peuvent être utilisés comme des fonctions - il suffit d'utiliser la syntaxe d'invocation:

g = Graphics()

g est appelée une "instance" de la Graphics de classe. Lorsque vous créez des instances d'une classe, tous les attributs qui ne correspondent lookups pas les attributs de l'instance regardent les attributs de l'objet de la classe suivante. Voilà pourquoi cette recherche fonctionne:

assert g.screen_size == (1024, 768)

Si l'on ajoute un attribut à la par exemple avec le même nom, cependant, la recherche sur l'instance réussira, et il ne sera pas à aller chercher à l'objet de classe. Vous essentiellement « masque » la valeur de l'objet de classe avec une valeur fixée directement sur l'instance. Notez que ce ne pas modifier la valeur de l'attribut dans l'objet de classe:

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

Alors, ce que vous faites dans votre méthode de __init__ est exactement ce que nous avons fait ci-dessus:. Définir un attribut de par exemple , 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)

La Graphics.screen_size valeur peut être utilisée partout après cette définition de classe, comme le montre la première instruction assert dans l'extrait ci-dessus.

Edit: Et ne pas oublier de consulter section du Python Tutorial sur les classes , qui couvre tout cela et plus.

Il est probable un type de object si

self.screen = object()

pourrait travailler (si je comprends bien votre question).

ugh ... PEBKAC.

Je suis tellement habitué à C que je continue à vous oublier pouvez faire plus que juste à l'extérieur de prototype defs.

Réécriture comme cela et cela a fonctionné:

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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top