Python - Nesneye Dayalı Programlama

1,175 views
877 views

Published on

Python'da sınıf tanımlama, kalıtım, veri saklama, paylaşılan sınıf değişkenleri, modüller, paketler, aykırı durum işleme.

Bu sunumdaki örnek kodları şu adresten alabilirsiniz:
https://dl.dropboxusercontent.com/u/61579540/Python/02.nesneler.kod.zip

Published in: Education
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,175
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Python - Nesneye Dayalı Programlama

  1. 1. Python Nesneye Dayalı Programlama H. Turgut Uyar Ocak 2014
  2. 2. License © 2013-2014 H. Turgut Uyar You are free to: Share – copy and redistribute the material in any medium or format for any purpose, even commercially. Under the following terms: Attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. NoDerivatives – If you remix, transform, or build upon the material, you may not distribute the modified material. For more information: https://creativecommons.org/licenses/by-nd/4.0/ Read the full license: https://creativecommons.org/licenses/by-nd/4.0/legalcode
  3. 3. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  4. 4. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  5. 5. ¨ Ornek: Mastermind de˘i¸ik roller: gs tutan, tahmin eden de˘i¸ik oyuncular: gs insan, bilgisayar de˘i¸ik taktikler: gs rasgele, tekrarsız, akıllı
  6. 6. ¨ Onceki Ger¸ekleme c iki oyuncu rol¨ aynı programda ger¸ekleniyor u c sırrı se¸ c oyun devam etti˘i s¨rece: g u tahmini al tahmini de˘erlendir g sonucu bildir
  7. 7. Sırrın Se¸ilmesi c se¸im uzayının belirlenmesi c choices = tuple(range(10)) n_items = 4 secret = get_secret(choices, n_items)
  8. 8. Oyunun Akı¸ı s oyun akı¸ının y¨netilmesi s o result = 0 while result == 0: guess = get_guess(...) if len(guess) == 0: result = -1 else: (plus, minus) = evaluate_guess(guess, secret) print(’%d+%d-’ % (plus, minus)) if plus == n_items: result = 1
  9. 9. Oyunun Akı¸ı s tahmin eden oyuncuya ek bilgiler: ¨nceki tahminler o all_secrets = ... result = 0 guesses = {} while result == 0: guess = get_guess(all_secrets, guesses) if len(guess) == 0: result = -1 else: (plus, minus) = evaluate_guess(guess, secret) guesses[guess] = (plus, minus) print(’%d+%d-’ % (plus, minus)) if plus == n_items: result = 1
  10. 10. Akıllı Tahmin o c s ¨ncekilerle ¸eli¸meyen rasgele tahmin def get_guess(all_secrets, guesses): candidates = [] for candidate in all_secrets: for prev in guesses: if evaluate_guess(prev, candidate) != guesses[prev]: break else: candidates.append(candidate) guess = random.choice(candidates) return guess
  11. 11. Sınıflar sınıf tanımlama: class nesnenin yaratılması sınıf adını ca˘ırarak ¸ g class ClassName: def method_name(...): block obj = ClassName(...)
  12. 12. Sınıflar metotların ilk parametresi: self ¸a˘ırırken yazılmaz c g sıfırlama metodu: .__init__() class ClassName: def __init__(self, init_parameter_1, init_parameter_2, ...): block_init def method_name(self, parameter_1, parameter_2, ...): block_method obj = ClassName(init_value_1, init_value_2, ...) obj.method_name(value_1, value_2, ...)
  13. 13. ¨ Ornek: Tutan Oyuncu Sınıfı class Chooser: def __init__(self, choices, n): self.choices = choices self.n_items = n self.secret = ... def evaluate(self, guess): return evaluate_guess(guess, self.secret)
  14. 14. ¨ Ornek: Tutan Oyuncu Nesnesi def main(): choices = tuple(range(10)) n_items = 4 chooser = Chooser(choices, n_items) ... (plus, minus) = chooser.evaluate(guess) ...
  15. 15. ¨ Ornek: Tahmin Eden Oyuncu Sınıfı tahmin eden oyuncu olası sırları ve eski tahminleri kendisi tutabilir class Guesser: def __init__(self, choices, n): self.choices = choices self.n_items = n self.all_secrets = ... self.guesses = {} def get_guess(self): ... return guess
  16. 16. ¨ Ornek: Tahmin Eden Oyuncu Sınıfı yeni tahminin sonucunu nasıl kaydedecek? class Guesser: ... def register_guess(self, guess, plus, minus): self.guesses[guess] = (plus, minus)
  17. 17. ¨ Ornek: Tahmin Eden Oyuncu Nesnesi def main(): choices = tuple(range(10)) n_items = 4 chooser = Chooser(choices, n_items) guesser = Guesser(choices, n_items) ... guess = guesser.get_guess() (plus, minus) = chooser.evaluate(guess) print(’%d+%d-’ % (plus, minus)) guesser.register_guess(guess, plus, minus) ...
  18. 18. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  19. 19. Kalıtım class ClassName(superclass_1, superclass_2, ...): ... ust sınıfa eri¸im: super() s ¨ alt sınıf .__init__() metodunu ezmezse ust sınıfınki kendili˘inden ¸alı¸ır g c s ¨ alt sınıf .__init__() metodunu ezerse ust sınıfınki kendili˘inden ¸alı¸maz g c s ¨
  20. 20. ¨ Ornek: De˘i¸ik Tahmin Stratejileri gs iki tahminci t¨r¨: akıllı, rasgele uu her tahmincinin kendi .get_guess() metodu olmalı class BaseGuesser: ... class RandomGuesser(BaseGuesser): ... class SmartGuesser(BaseGuesser): ...
  21. 21. ¨ Ornek: Rasgele Tahminci class RandomGuesser(BaseGuesser): def get_guess(self): guess = tuple(random.sample(self.choices, self.n_items)) return guess gerekenler: self.choices, self.n_items
  22. 22. ¨ Ornek: Akıllı Tahminci class SmartGuesser(BaseGuesser): def get_guess(self): candidates = [] for candidate in self.all_secrets: for prev in self.guesses: ... guess = random.choice(candidates) return guess gerekenler: self.all_secrets, self.guesses gerekebilir: self.choices, self.n_items
  23. 23. ¨ Ornek: Taban Tahminci class BaseGuesser: def __init__(self, choices, n): self.choices = choices self.n_items = n class SmartGuesser(BaseGuesser): def __init__(self, choices, n): super().__init__(choices, n) self.all_secrets = ... self.guesses = {} RandomGuesser sınıfının .__init__() i¸in yapması gereken c ek bir i¸lem yok → ezmeye gerek yok s
  24. 24. ¨ Ornek: Taban Tahminci bazı tahmincilere tahmin sonucunun bildirilmesi gerekiyor kullanan tahminciler ilgili metodu ezmeli class BaseGuesser: ... def register_guess(self, guess, plus, minus): pass class SmartGuesser(BaseGuesser): ... def register_guess(self, guess, plus, minus): self.guesses[guess] = (plus, minus)
  25. 25. Soyut Taban Sınıflar import abc class ClassName(metaclass=abc.ABCMeta): ... @abc.abstractmethod def method_name(self, ...): ...
  26. 26. ¨ Ornek: Taban Tahminci .get_guess() metodu i¸in anlamlı bir varsayılan davranı¸ yok c s alt sınıfta ezilmesi zorunlu olsun class BaseGuesser(metaclass=abc.ABCMeta): ... @abc.abstractmethod def get_guess(self): pass
  27. 27. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  28. 28. Aykırı Durumlar aykırı durum uretme: raise ¨ aykırı durum yakalama: try - except - finally finally kısmı her zaman calı¸ır ¸ s try: block except Exception1 as e1: exception_block_1 except Exception2 as e2: exception_block_2 ... finally: finally_block
  29. 29. ¨ Ornek: ˙ Insan Tahminci class HumanProxyGuesser(BaseGuesser): def get_guess(self): value = input("Make a guess: ") guess = [] for c in value: digit = int(c) guess.append(digit) return tuple(guess) kullanıcı rakam dı¸ı simgeler girerse? s kısa ya da uzun bir rakam dizisi girerse?
  30. 30. ¨ Ornek: ˙ Insan Tahminci if len(value) == 0: break elif len(value) != self.n_items: print("Please type exactly %d digits." % self.n_items) else: for c in value: try: digit = int(c) guess.append(digit) except ValueError as e: print("Please type only digits.")
  31. 31. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  32. 32. Saklı Nitelikler sınıf elemanları dı¸arıdan eri¸ime a¸ık s s c if result == 1: print("You won in %d guesses." % n_guesses) else: print("You gave up after %d guesses." % n_guesses) print("The secret was: {0}.".format(chooser.secret)) __ ile ba¸layan ama __ ile bitmeyen elemanlar saklı s
  33. 33. ¨ Ornek: Sırrı Koruma sır oyun bitene kadar saklansın class Chooser: def __init__(self, choices, n): self.choices = choices self.n_items = n self.__secret = ... def get_secret(self): if self.game_over: return self.__secret else: raise RuntimeError("...")
  34. 34. ¨ Ornek: Sırrı Koruma oyunun bitti˘ini tutan oyuncuya haber vermek gerek g oyun bittikten sonra yeni tahmin olmamalı class Chooser: ... def evaluate(self, guess): if self.game_over: raise RuntimeError("...") return evaluate_guess(guess, self.__secret) def finish(self): self.game_over = True
  35. 35. ¨ Ozellikler eri¸me ve de˘i¸tirme metodları ye˘lenmiyor s gs g saklı niteliklere eri¸im i¸in ¨zellik tanımlama: property s c o class ClassName: def get_foo(self): if ...: return self.__foo def set_foo(self, value): if ...: self.__foo = value foo = property(fget=get_foo, fset=set_foo)
  36. 36. ¨ Ornek: Sırrı Koruma class Chooser: ... secret = property(fget=get_secret) chooser.finish() if result == 1: print("You won in %d guesses." % n_guesses) else: print("You gave up after %d guesses." % n_guesses) print("The secret was: {0}.".format(chooser.secret))
  37. 37. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  38. 38. Payla¸ılan Nitelikler s sınıf nitelikleri: metotların dı¸ında tanımlananlar s sınıfın t¨m nesneleri arasında payla¸ılır u s nesneye ba˘lı olmayan metodlar: @staticmethod g self parametresi g¨nderilmez o
  39. 39. ¨ Ornek: Girdi Denetimi insan oyuncunun girdi˘i de˘er d¨zenli ifadeyle kontrol edilsin g g u class HumanProxyGuesser(BaseGuesser): VALID_INPUT = ’^d{4}$’ def get_guess(self): ... input_valid = re.match(self.VALID_INPUT, value) if not input_valid: ...
  40. 40. ¨ Ornek: Tahmin De˘erlendirme g evaluate_guess() fonksiyonu Chooser sınıfının metodu olsun class Chooser: ... @staticmethod def evaluate_guess(guess, secret): ... return (plus, minus) def evaluate(self, guess): if self.game_over: raise RuntimeError("...") return self.evaluate_guess(guess, self.__secret)
  41. 41. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  42. 42. Mod¨ller u her Python kaynak dosyası bir mod¨l u import komutu ile isim uzayına alınabilir
  43. 43. ¨ Ornek: Tutan Oyuncular tutan oyuncularla ilgili kodlar choosers mod¨l¨nde uu (choosers.py) ana fonksiyon cli mod¨l¨nde (cli.py) uu from choosers import Chooser def main(): ... chooser = Chooser(...) ...
  44. 44. Konular 1 Sınıflar Giri¸ s Kalıtım Aykırı Durumlar 2 Veri Koruma Saklı Nitelikler Payla¸ılan Nitelikler s 3 Paketler Mod¨ller u Paketler
  45. 45. Paketler mod¨ller paketlere toplanabilir u her paket bir klas¨r o
  46. 46. ¨ Ornek: Paket Yapısı tepe paket (ve klas¨r): mastermind o tutan oyuncular mod¨l¨: uu choosers.py → mastermind.choosers tahmin eden oyuncularla ilgili mod¨ller guessers paketinde: u guessers/base.py → mastermind.guessers.base guessers/random.py → mastermind.guessers.random guessers/smart.py → mastermind.guessers.smart guessers/human.py → mastermind.guessers.human
  47. 47. ¨ Ornek: Rasgele Tahminci from mastermind.guessers.random import RandomGuesser def main(): ... guesser = RandomGuesser(...) ...
  48. 48. Paketler paket i¸inde aynı klas¨rdeki mod¨l: c o u from .module import name b¨t¨n tahmincilerin base mod¨l¨n¨ alması gerek uu uu u from .base import BaseGuesser class RandomGuesser(BaseGuesser): def get_guess(self): ...
  49. 49. Paketler paket i¸inde bir ust klas¨rdeki mod¨l: c o u ¨ from ..module import name akıllı tahmincinin choosers mod¨l¨n¨ alması gerek uu u from .base import BaseGuesser from ..choosers import Chooser class SmartGuesser(BaseGuesser): ... def get_guess(self): ... Chooser.evaluate_guess(prev, candidate)

×