Klasy

Opis klas i programowania obiektowego w Pythonie. Opis elementów takich jak - Dziedziczenie, Ukrywanie danych, Klasy i typy

Klasy są podstawowym narzędziem do tworzenia struktur danych i nowych obiektów. Instrukcja class pozwala definiować własne klasy:
class koszyk:
	def __init__ (self):
		self.koszyk = []
	def dodaj(self,obiekt):
		self.koszyk.append(obiekt)
	def rozmiar(self):
		return len(self.koszyk)
Pierwszy argument każdej metody - "self" - przekazuje do każdej metody (funkcji zdefiniowanej wewnątrz klasy) instancję klasy na jakiej mają operować. Metody poprzedzone __ to metody specjalne, np __init__ jest wykonywana przy utworzeniu instancji klasy. Instancje powstają w wyniku wywołania obiektu klasy jako funkcji:
s = koszyk() # stworzenie instancji klasy
s.dodaj("pierwszy wpis")
s.dodaj("drugi wpis")
print s.rozmiar()
Po utworzeniu nowej instancji klasy jej atrybuty i metody dostępne są za pomocą operatora kropki (w naszym przypadku zmienna "s" przechowuje instancję naszej klasy tak więc stosujemy "s.metoda_klasy"). Wewnętrznie każda instancja jest implementowana przy użyciu słownika __dict__ zawierającego unikatowe informacje o każdej instancji:
class koszyk:
	def __init__ (self):
		self.koszyk = []
	def dodaj(self,obiekt):
		self.koszyk.append(obiekt)
	def rozmiar(self):
		return len(self.koszyk)

s = koszyk()
s.dodaj("pierwszy wpis")
s.dodaj("drugi wpis")
print s.__dict__
Tak jak w przypadku funcji można dodawać atrybuty, które pojawią się w słowniku __dict__:
s.atrybut = 'wartość'

Dziedziczenie

Dziedziczenie to mechanizm tworzenia nowych klas modyfikujących już istniejące klasy. Oryginalna klasa nazywa się klasą bazową lub superklasą, zaś nowa nazywana jest klasą pochodną lub podklasą. Klasa potomna dziedziczy wszystkie atrybuty klasy bazowej. Dziedziczenie zapisuje się w instrukcji klas za pomocą listy oddzielonych przecinkami klas bazowych:
class produkt:
	ilosc = 0
	def ustaw_ilosc(self, ilosc):
		self.ilosc = ilosc

class pomidor(produkt):
	opis = 'swieże pomidory z syberii'
	
p = pomidor()
p.ustaw_ilosc(11)
print p.ilosc
print p.opis
W powyższym przykładzie klasa "pomidor" dziedziczy po klasie "produkt" zyskując dostęp do metod i atrybutów dziedziczonej klasy. Należy pamiętać że podczas inicjalizowania instancji klasy pochodnej nie jest wywoływana metoda __init__ klasy bazowej. Jeżeli musimy wykonać tą metodę wystarczy skorzystać ze składni:
KLASA_BAZOWA.__init__(self)
class produkt:
	ilosc = 0
	def __init__(self):
		self.ilosc = 111
	def ustaw_ilosc(self, ilosc):
		self.ilosc = ilosc

class pomidor(produkt):
	def __init__(self):
		produkt.__init__(self)
	opis = 'swieże pomidory z syberii'
	
p = pomidor()
print p.ilosc
print p.opis

Ukrywanie danych

Domyślnie wszystkie atrybuty są "publiczne" i dostępne są bez ograniczeń. Czasami, np. w przypadku dziedziczenia może dojść też do konfliktu nazw. By temu zaradzić wszystkie nazwy atrybutów zaczynających się od dwóch znaków podkreślenia przekształcane są na nowe nazwy w postaci _NazwaKlasy__.NAZWA:
class produkt:
	__ilosc = 0
	def __init__(self):
		self.__ilosc = 111
	def ustaw_ilosc(self, ilosc):
		self.__ilosc = ilosc

class pomidor(produkt):
	def __init__(self):
		produkt.__init__(self)
		self.ilosc = 10
	opis = 'swieże pomidory z syberii'
	
p = pomidor()
print p._produkt__ilosc
print p.ilosc
print p.opis
W powyższym przykładzie atrybut "ilosc" występuje w obu klasach i zastosowanie "__" uchroniło nas przed nadpisaniem atrybutu/wartości z klasy bazowej.

Klasy i typy

Wszystkie definicje mają typ "ClassType", a wszystkie instancje "InstanceType". Aby sprawdzić przynależność obiektu do jakiejś klasy można użyć funkcji isinstance(obiekt,klasa), która zwróci wartość Prawda jeżeli "obiekt" należy do "klasy". Funkcja issubclass(A,B) zwróci wartość Prawda jeżeli klasa A jest podklasą klasy B.
blog comments powered by Disqus

Kategorie

Strony