Я думаю, что вам может помочь краткое объяснение различия между атрибутами класса и экземпляра в 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 о классах , который охватывает все это и многое другое.