Набор действий над атрибутом объекта. Свойства



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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!