python-02
.pdfОбщий случай описания класса
Пример
class A:
var = 1 # простой аттрибут lst = [1,2,3] # список
def foo(self,var): # метод класса pass
Общий случай описания класса
Пример
class A:
var = 1 # простой аттрибут lst = [1,2,3] # список
def foo(self,var): # метод класса pass
Пример использования
>>> A.lst |
# атрибут класса |
||
[1, |
2, |
3] |
|
>>> a = A() |
# создание объекта |
||
>>> a.lst |
# атрибут объекта |
||
[1, |
2, |
3] |
|
>>> a.foo('b') |
# вызов метода |
|
Изменение класса |
Пример |
|
class A: |
# пустой класс |
pass |
|
def myMethod(self, x): # просто функция |
|
return x * x |
|
A.m1 = myMethod |
# создание метода "на лету" |
A.attr1 = 2 * 2 |
|
|
Изменение класса |
Пример |
|
class A: |
# пустой класс |
pass |
|
def myMethod(self, x): # просто функция |
|
return x * x |
|
A.m1 = myMethod |
# создание метода "на лету" |
A.attr1 = 2 * 2 |
|
Пример использования
>>>a = A()
>>>a.m1(2)
4
>>>def foo(self,x):
... return x ** x
>>>A.m2 = foo
>>>a.m2(3)
27
Конструктор и деструктор
Пример
class A:
def __init__(self):
print "Создается объект" def __del__(self):
print "Уничтожается объект"
>>>a=A() Создается объект
>>>del a Уничтожается объект
Инкапсуляция и доступ к свойствам
Пример
class A(object): def getx(self):
print "получение x" return self._x
def setx(self,x): print "запись x" self._x = x
def delx(self): print "удаление x" del self._x
x = property(getx, setx, delx, "Свойство x")
>>>a.x=1 запись x
>>>a.x получение x 1
>>>del a.x удаление x
Полиморфизм
Пример
class |
A(object): |
# |
предок |
def f(self): |
|
|
|
print "pac" |
|
|
|
class |
B(A): |
# |
потомок |
def f(self): print "dva"
super(B,self).f() # доступ к методам предка
>>>b=B()
>>>b.f()
dva pac
Полиморфизм
Изменяя атрибут __class__, можно перемещать объект вверх или вниз по иерархии наследования:
Пример
>>>b=B()
>>>b.f()
dva pac
>>>b.__class__ = A
>>> |
b.f() |
# теперь b --- объект класса A |
pac |
|
|
Однако, в этом случае никакие преобразования типов не делаются, поэтому забота о согласованности данных всецело лежит на программисте.
Имитация встроенных типов
Имитация функции:
Пример
>>> class Add:
... |
def __call__(self, x, y): |
... |
return x + y |
...
>>>add = Add()
>>>add(3, 4)
7
#определение метода,
#который отвечает за операцию
#вызова функции
#это эквивалентно add.__call__(3, 4)
Сериализация
Следующий пример показывает как работает сериализация-десериализация с использованием pickle:
Пример
>>>import pickle
>>>p = set([1, 2, 3, 5, 8])
>>> pickle.dumps(p) # сериализация 'c__builtin__\nset\np0\n((lp1\nI8\naI1\naI2\naI3\naI5\natp2\nRp3\n.'
>>>import pickle
>>>p = # де-сериализация pickle.loads( \
'c__builtin__\nset\np0\n((lp1\nI8\naI1\naI2\naI3\naI5\natp2\nRp3\n.' \
)
>>>print p
set([8, 1, 2, 3, 5])
Получаемая при сериализации строка может быть передана по сети, записана в файл или специальное хранилище объектов, а позже прочитана.