Kurs języka Python
Wykład 12.
Marcin Młotkowski
11 stycznia 2010
1
Atrybuty specjalne
2
Implementacja kolekcji
3
Generatory
4
Introspekcje (refleksje)
5
Dekoratory
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Funkcje i operatory wbudowane
cmp(x, y)
len(collection) d[i] = v
str(obj) d[i]
<, >, == del v[i]
+, -, ", /
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Zadanie
Implementacja klasy wektorówVector:
operatory arytmetyczne
v1 = Vector([1, 0, 0])
v1 = Vector([0, 1, 0])
v3 = v1 + v2
str(Vector([0, 0 1])): <0, 0, 1>
len(Vector([0, 0 1])): 3
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja wektorów
class Vector:
def __init__(self, lista):
self.value = lista
Implementacja dodawania
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self.value) <> len(arg.value):
return None
res = Vector( [x + y for x, y in zip(self.value, arg.value) ])
return res
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja wektorów
class Vector:
def __init__(self, lista):
self.value = lista
Implementacja dodawania
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self.value) <> len(arg.value):
return None
res = Vector( [x + y for x, y in zip(self.value, arg.value) ])
return res
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Wykorzystanie
v1 = Vector([1, 0, 3])
v2 = Vector([0, 2, 0])
print v1 + v2
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Inne standardowe metody
__mul__
__sub__
__div__
__mod__
Tak zdefiniowane operatory zachowują standardowe priorytety.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Postać napisowa
>>> print Vector([1,2,3])
<__main__.Vector instance at 0xb7eabdec>
class Vector
def __str__(self):
return < + , .join([str(x) for x in self.value]) + >
>>> print Vector([1,2,3])
<1, 2, 3>
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Postać napisowa
>>> print Vector([1,2,3])
<__main__.Vector instance at 0xb7eabdec>
class Vector
def __str__(self):
return < + , .join([str(x) for x in self.value]) + >
>>> print Vector([1,2,3])
<1, 2, 3>
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Postać napisowa
>>> print Vector([1,2,3])
<__main__.Vector instance at 0xb7eabdec>
class Vector
def __str__(self):
return < + , .join([str(x) for x in self.value]) + >
>>> print Vector([1,2,3])
<1, 2, 3>
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Własności kolekcji
Pożądane cechy kolekcji
Indeksowany dostęp do danych k[4]
Obsługa poprzez iteratory for in
rozmiar kolekcji len
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dostęp indeksowany
Implementacja akcesorów w klasieVector
def __getitem__(self, index):
return self.value[index]
def __setitem__(self, index, value):
self.value[index] = value
Zastosowanie
>>> print v1[k]
>>> v1[k] = k
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Pozostałe własności kolekcji
Usuwanie elementu za pomoca del
def __delitem__(self, index):
del self.value[index]
Długość kolekcji: len
def __len__(self):
return len(self.value)
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Pozostałe własności kolekcji
Usuwanie elementu za pomoca del
def __delitem__(self, index):
del self.value[index]
Długość kolekcji: len
def __len__(self):
return len(self.value)
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Przypomnienie z wykładu 4.
for w in v1: print i
Implementacja kolekcji
Na początku wywoływana jest metoda __iter__;
wartością powinien być obiekt (enumerator) implementujący
metodę next() która za każdym wywołaniem zwraca kolejny
element kolekcji;
metoda next() jest wywoływana tak długo, póki nie zostanie
zgłoszony wyjątek StopIteration.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Generator
Własności generatora
mechanizm leniwej ewaluacji;
przypomina działaniem return, ale zwraca iterator, nie
wskazywaną wartość;
pozwala zwrócić wartość zachowując stan obliczeń w
metodzie/funkcji.
Zwrócenie iteratora: instrukcja yield
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja kolekcji
class Vector (wersja bez generatora)
def __iter__(self):
self.indeks = 0
return self
def next(self):
if self.indeks >= len(self):
raise StopIteration
self.indeks += 1
return self.value[self.indeks - 1]
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Druga implementacja kolekcji
class Vector (wersja z generatorem)
def __iter__(self):
return self.nastepniki()
def nastepniki(self):
i=0
while i < len(self):
yield self[i]
i=i+1
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Reimplementacja metody __add__
poprzednia wersja
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self.value) <> len(arg.value):
return None
res = Vector( [x + y for x, y in zip(self.value, arg.value) ])
return res
nowa wersja
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self) <> len(arg):
return None
return Vector( [x + y for x, y in zip(self, arg) ])
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Reimplementacja metody __add__
poprzednia wersja
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self.value) <> len(arg.value):
return None
res = Vector( [x + y for x, y in zip(self.value, arg.value) ])
return res
nowa wersja
def __add__(self, arg):
if self.__class__ <> arg.__class__ or
len(self) <> len(arg):
return None
return Vector( [x + y for x, y in zip(self, arg) ])
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Definicja klasyVector
Podsumowanie
Można używać operatora + (__add__);
indeksowany dostęp do współrzędnych (__getitem__,
__setitem__)
iteracje po współrzędnych;
len()istr();
ukrycie implementacji.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Wykorzystanie yield
Implementacja nieskończonej listy potęg 2
def power2():
power = 1
while True:
yield power
power = power * 2
it = power2()
for x in range(4):
print it.next()
Nieskończona pętla
for i in power2(): print i
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Wykorzystanie yield
Implementacja nieskończonej listy potęg 2
def power2():
power = 1
while True:
yield power
power = power * 2
it = power2()
for x in range(4):
print it.next()
Nieskończona pętla
for i in power2(): print i
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Wyrażenia generatorowe
Instrukcja
wyr_generatorowe = (i** 2 for i in range(5))
jest równoważna
def wyr_generatorowe():
for i in range(5):
yield i**2
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Wprowadzenie
badanie stanu obiektu
badanie stanu obliczeń
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Stan obiektu/modułu
Napis .__class__
Figura.__doc__
Figura.__dict__
plik.__file__
__name__
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Słowniki symboli
Zmienne (oraz nazwy funkcji) w czasie działania programu są
przechowywane w słowniku.
dir()
__dict__
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Funkcja standardowa dir()
Co robi dir
Zwraca listę dostępnych nazw. Jeśli nie podano argumentu, to
podaje listę symboli w lokalnym słowniku.
>>> dir(Vector([1,2,3]))
[ __add__ , __cmp__ , __delitem__ , __doc__ ,
__getitem__ , __init__ , __len__ , __module__ ,
__setitem__ , __str__ , iter , next , value ]
>>> Vector([1,2]).__dict__
{ value : [1, 2, 3]}
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Funkcja standardowa dir()
Co robi dir
Zwraca listę dostępnych nazw. Jeśli nie podano argumentu, to
podaje listę symboli w lokalnym słowniku.
>>> dir(Vector([1,2,3]))
[ __add__ , __cmp__ , __delitem__ , __doc__ ,
__getitem__ , __init__ , __len__ , __module__ ,
__setitem__ , __str__ , iter , next , value ]
>>> Vector([1,2]).__dict__
{ value : [1, 2, 3]}
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Przydatność słowników
if nazwa in obj.__dict__:
print obj.nazwa
if "__str__" in dir(obj):
print dir(obj)
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Analiza biegu programu
dir() lista zmiennych lokalnych
locals() lokalny słownik zmiennych
globals() globalny słownik: klasy, funkcje etc.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dynamiczne wykonywanie programu
Instrukcja exec
exec "print 2 + 2"
exec open("foo.py")
Funkcja eval()
print eval( 2*2 )
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dynamiczna kompilacja kodu
Wbudowana funkcja compile(zródło, typ zródła, typ kodu) zwraca
obiekt reprezentujący skompilowany kod.
Przykład
x = 10
code = compile( print x\nprint 2*x ,
, exec )
exec code
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Problem z kontekstem wywołania
Skompilowanie kodu
x = 10
code = compile( print x\nprint 2*x , , exec )
wykonaj(code)
def wykonaj(kod):
exec kod
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Przekazanie kontekstu wywołania
Skompilowanie kodu
x = 10
code = compile( print x\nprint 2*x , , exec )
wykonaj(code)
def wykonaj(code):
loc = { x : 5}
exec code in loc
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Uniwersalny obiekt
Obiekt uniwersalny: ma wszystkie pola i implementuje dowolną
metodę.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja uniwersalnego obiektu
Implementacja klasy
class Uniwersalna:
Implementacja dostępu do atrybutów
def __getattr__(self, name):
print "Odwołujesz się do atrybutu", name
return self
def __setattr__(self, name, val):
print "Nadanie atrybutowi %s wartości %s)" % (name, val)
Wszystkie metody
def __call__(self, *args):
print "Wywołano metodę z argumentami", args
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja uniwersalnego obiektu
Implementacja klasy
class Uniwersalna:
Implementacja dostępu do atrybutów
def __getattr__(self, name):
print "Odwołujesz się do atrybutu", name
return self
def __setattr__(self, name, val):
print "Nadanie atrybutowi %s wartości %s)" % (name, val)
Wszystkie metody
def __call__(self, *args):
print "Wywołano metodę z argumentami", args
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja uniwersalnego obiektu
Implementacja klasy
class Uniwersalna:
Implementacja dostępu do atrybutów
def __getattr__(self, name):
print "Odwołujesz się do atrybutu", name
return self
def __setattr__(self, name, val):
print "Nadanie atrybutowi %s wartości %s)" % (name, val)
Wszystkie metody
def __call__(self, *args):
print "Wywołano metodę z argumentami", args
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Rozszerzanie właściwości funkcji
def szalenie_skomplikowana_funkcja(arg1, arg2, arg3):
...
Śledzenie wywołania funkcji
Chcemy śledzić wywołania zaimplementowanych funkcji, tj.
informacje o wywołaniu oraz informacja o argumentach wywołania.
Bez ingerowania w te funkcje.
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Schemat rozwiązania
Rozwiązanie 1.
def log_foo(*args):
print "Wywoływana funkcja: foo z argumentami", args
return foo(*args)
Co z tym zrobić 1.
Zamiast foo używamy log_foo.
Co z tym zrobić 2.
foo = log_foo
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Schemat rozwiązania
Rozwiązanie 1.
def log_foo(*args):
print "Wywoływana funkcja: foo z argumentami", args
return foo(*args)
Co z tym zrobić 1.
Zamiast foo używamy log_foo.
Co z tym zrobić 2.
foo = log_foo
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Schemat rozwiązania
Rozwiązanie 1.
def log_foo(*args):
print "Wywoływana funkcja: foo z argumentami", args
return foo(*args)
Co z tym zrobić 1.
Zamiast foo używamy log_foo.
Co z tym zrobić 2.
foo = log_foo
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Uniwersalna funkcja opakowująca inne funkcje
def log(fun):
def opakowanie(*args):
print "funkcja:", fun.__name__, "argumenty", args
return foo(*args)
return opakowanie
Zastosowanie
foo = log(foo)
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Uniwersalna funkcja opakowująca inne funkcje
def log(fun):
def opakowanie(*args):
print "funkcja:", fun.__name__, "argumenty", args
return foo(*args)
return opakowanie
Zastosowanie
foo = log(foo)
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dekoratory
def log(fun):
def opakowanie(*args):
print "funkcja:", fun.__name__, "argumenty", args
return foo(*args)
return opakowanie
Zastosowanie
@log
def foo(args):
...
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dekoratory
def log(fun):
def opakowanie(*args):
print "funkcja:", fun.__name__, "argumenty", args
return foo(*args)
return opakowanie
Zastosowanie
@log
def foo(args):
...
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Dekoratory standardowe
Dekorowanie programów wielowątkowych
from threading import Lock
my_lock = Lock()
@synchronized(my_lock)
def critical1(): ...
@synchronized(my_lock)
def critical2(): ...
Marcin Młotkowski Kurs języka Python
Atrybuty specjalne
Implementacja kolekcji
Generatory
Introspekcje (refleksje)
Dekoratory
Implementacja dekoratora
def synchronized(lock):
def wrap(f):
def new_function(*args, **kw):
lock.acquire()
try:
return f(*args, **kw)
finally:
lock.release()
return new_function
return wrap
Marcin Młotkowski Kurs języka Python
Wyszukiwarka
Podobne podstrony:
wyklad 7 12
Wykład 12 XML NOWOCZESNY STANDARD ZAPISU I WYMIANY DOKUMENTU
wyklad 9 12 makro heller
Wyklad 12 Podstawowe typy zwiazkow chemicznych blok s i p PCHN SKP studport
Wyklad 12 europejski nakaz dochodzeniowy
Wyklad 12 Elektryczność i magnetyzm Prawo Gaussa
Geo fiz wykład 12 12 2012
wykład 12 ETI
Wykład 1 (12 03 2011) ESI
Wykład 7 8 12 12
Socjologia wyklady 1 12(1)
WYKŁAD 12 SKAŁY OSADOWE
Wyklad 12 Kryzys finansowy
Wyklad 12 stacj Genetyka z biotechn
Wykład 8 8 12 12
Wykład 12
więcej podobnych podstron