Набор действий над атрибутом объекта. Свойства
class A(object):
def __init__(self, x):
self._x = x
def getx(self): # метод для получения значения
return self._x
def setx(self, value): # присваивания нового значения
self._x = value
def delx(self): # удаления атрибута
del self._x
x = property(getx, setx, delx, "Свойство x") # определяем x как свойство
a = A(5)
print(a.x) # Синтаксис доступа к атрибуту при этом прежний
a.x = 5
Чтобы превратить атрибут в свойство, доступное для чтения и записи, нам необходимо создать частный атрибут, который будет являться фактическим хранилищем данных и будет использоваться методами чтения и записи. Ниже приводится полная реализация методов чтения и записи, а также строка документирования:
@property
def radius(self):
“””Радиус окружности
>>> circle = Circle(-2)
Traceback (most recent call last):
AssertionError: radius must be nonzero and non-negative
>» circle = Circle(4)
>» circle, radius = -1
Traceback (most recent call last):
AssertionError: radius must be nonzero and non-negative
>» circle, radius = 6
“””
return self.__radius
@radius.setter
def radius(self, radius):
assert radius > 0, "radius must be nonzero and non-negative"
self.__radius = radius
Чтобы убедиться, что записываемое значение радиуса больше нуля, используется инструкция assert; после проверки значение радиуса сохраняется в частном атрибуте self.__radius. Примечательно, что методы чтения и записи (и метод удаления, если бы он нам потребовался) имеют одно и то же имя - они отличаются только декораторами, и декораторы соответствующим образом переименовывают методы, чтобы исключить конфликты имен.
|
|
Декоратор метода записи может показаться немного необычным на первый взгляд. Каждое создаваемое свойство имеет атрибут getter, setter или deleter, поэтому, как только свойство radius будет создано, появятся атрибуты radius.getter, radius.setter и radius.deleter. В атрибут radius, getter декоратором @property записывается ссылка на метод чтения. Другие два атрибута устанавливаются интерпретатором так, что они ничего не делают (поэтому в атрибут ничего нельзя записать или удалить его), если они не были использованы как декораторы; тогда они замещаются декорируемыми ими методами.
Конструктор и деструктор
Специальные методы вызываются при создании экземпляра класса (конструктор) и при удалении класса (деструктор). В языке Python реализовано автоматическое управление памятью, поэтому деструктор требуется достаточно редко, для ресурсов, требующих явного освобождения.
Следующий класс имеет конструктор и деструктор:
class Line:
def __init__(self, p1, p2):
self.line = (p1, p2)
def __del__(self):
print "Удаляется линия %s - %s" % self.line
>>> l = Line((0.0, 1.0), (0.0, 2.0))
>>> del l
Удаляется линия (0.0, 1.0) - (0.0, 2.0)
>>>
Следует заметить, что в момент вызова деструктора (например, по завершении программы) среда исполнения может быть уже достаточно «истощенной», поэтому в деструкторе следует делать только самое необходимое. Кроме того, необработанные в деструкторе исключения игнорируются.
|
|
Оператор class – это исполняемый оператор
Как уже было сказано выше, класс в языке Python создается в момент его определения. Однако он не только создается, но и выполняется в момент определения. Другими словами, оператор class в языке Python – это исполняемый оператор. Условно создание класса можно описать так:
· Создается переменная с именем класса
· Создается объект типа класс, ссылка на который заносится в переменную
· Последовательно исполняется код класса, его инструкции последовательно исполняются одна за одной, создавая поля и методы, определенные в классе. Операторы присваивания создают поля, операторы определения функций, def, создают методы. Таким образом, класс получает атрибуты класса, которые будут доступны через имя класса.
Класс тоже объект
В языке Python класс является полноценным объектом, с которым можно производить определенные действия, например, присвоить переменной, передать в функцию в виде аргумента и получить из функции в виде результата. Например, возможен такой код:
|
|
>>> class AD:
... ...
...
>>> type(AD)
<class 'type'>
>>> b = AD
>>> del AD
>>> a = b()
>>> type(a)
<class 'AD'>
>>> type(b)
Текстовые игры
Что такое текстовая игра
Текстовая игра — это видеоигра без видео! Или, по крайней мере, без графики. Текстовые игры похожи на интерактивные книги, которые вы читаете в ходе игры. Пользователь включает собственное воображение для придумывания сюжета. Вероятно, вы, как дитя эпохи графического интерфейса, даже никогда не видели текстовую игру. Интерфейс в применении к текстовой игре означает примерно следующее:
Что вы хотите сделать? — Съесть яблоко.
М-мм, как вкусно!
Что вы хотите сделать? —
Как работает текстовая игра
Это хороший вопрос. На него есть много ответов, но все они верны только до некоторой степени, хотя и имеют много общего. Во-первых, интерфейс игры двунаправленный и, кроме того, чисто текстовый. Это означает, что компьютер может выводить информацию для игрока только в виде текста и игрок может вводить данные тоже только в виде текста. Кроме того, в игре нет джойстика, мыши или, например, световых перьев. Во-вторых, игра состоит из некоторого типа "миров" (сцен), будь то прерии, здание или космическая станция. Миры же состоят из геометрии, описаний и правил. Геометрия представляет собой фактическую геометрию мира, размер и размещение комнат, коридоров, водоемов и т.д. Описание является текстом, который служит для того, чтобы игрок мог представить себе, как выглядит, например, местность, какими звуками и запахами она наполнена. Правила игры определяют, что можно, а что нельзя делать. Например, вы не можете есть скалы, но можете съесть сэндвич.
|
|
Дополнительно про текстовые игры см.:
Программирование игр для Windows. Советы профессионала ( Андре Ламот - 2004 ) гл. 14 стр. 765
Дата добавления: 2020-01-07; просмотров: 191; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!