Как создать атрибут класса, который не является стандартным типом данных? - PullRequest
0 голосов
/ 19 декабря 2008

У меня есть один класс, который должен получить атрибут, установленный в другом. Это не стандартный тип данных, хотя. Вот код:

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"

Мне нужно сослаться на атрибут экрана, который я могу установить с помощью self.screen и быть доступным для чтения в этом классе ... но из другого класса я должен установить

screen = ?

под

class graphics:

Каким должен быть этот знак вопроса? Я пробовал 0, None, "" ... кажется, ничего не работает, я понятия не имею, какой тип данных будет для вызова Pygame. : S

Ответы [ 4 ]

1 голос
/ 19 декабря 2008

Я думаю, что вам может помочь краткое объяснение различия между атрибутами класса и экземпляра в Python.

Когда вы пишете код так:

class Graphics:
    screen_size = (1024, 768)

Класс Graphics на самом деле сам объект - объект класса. Поскольку вы определили screen_size внутри него, screen_size является атрибутом объекта Graphics. Вы можете увидеть это в следующем:

assert Graphics.screen_size == (1024, 768)

В Python эти объекты класса могут использоваться как функции - просто используйте синтаксис вызова:

g = Graphics()

g называется «экземпляром» класса Graphics. Когда вы создаете экземпляры класса, все поиски атрибутов, которые не соответствуют атрибутам экземпляра, затем смотрят на атрибуты объекта класса. Вот почему этот поиск работает:

assert g.screen_size == (1024, 768)

Если мы добавим атрибут к экземпляру с тем же именем, поиск экземпляра будет выполнен успешно, и ему не нужно будет искать объект класса. Вы в основном «маскируете» значение объекта класса значением, установленным непосредственно в экземпляре. Обратите внимание, что не не изменяет значение атрибута в объекте класса:

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

Итак, что вы делаете в своем методе __init__, это точно , что мы делали выше: установка атрибута instance , 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)

Значение Graphics.screen_size может использоваться в любом месте после определения этого класса, как показано с первым оператором assert в приведенном выше фрагменте.

Редактировать: И не забудьте проверить раздел Учебника по Python о классах , который охватывает все это и многое другое.

0 голосов
/ 19 декабря 2008

тьфу ... PEBKAC.

Я настолько привык к C, что постоянно забываю, что вы можете сделать больше, чем просто прототип вне defs.

переписал как это и получилось:

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"
0 голосов
/ 19 декабря 2008

Вы редко, если вообще когда-либо, ссылаетесь на атрибуты класса. Вы ссылаетесь на атрибуты объекта.

(Кроме того, имена классов должны быть в верхнем регистре: 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"

Вот пример получения или установки атрибута объекта.

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)

Обратите внимание, что мы создали объект (g) из нашего класса (Graphics). Мы вообще не очень часто обращаемся к классу. Практически единственный раз, когда используется имя класса, это создание экземпляров объекта (Graphics()). Мы редко говорим Graphics.this или Graphics.that для ссылки на атрибуты самого класса.

0 голосов
/ 19 декабря 2008

Это, вероятно, тип object, поэтому

self.screen = object()

может сработать (если я правильно понял ваш вопрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...