• Save
Python - Nesneye Dayalı Programlama
Upcoming SlideShare
Loading in...5
×
 

Python - Nesneye Dayalı Programlama

on

  • 411 views

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. ...

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

Statistics

Views

Total Views
411
Views on SlideShare
411
Embed Views
0

Actions

Likes
3
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NoDerivs LicenseCC Attribution-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Python - Nesneye Dayalı Programlama Python - Nesneye Dayalı Programlama Presentation Transcript

  • Python Nesneye Dayalı Programlama H. Turgut Uyar Ocak 2014
  • 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
  • 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
  • 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
  • ¨ 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ı
  • ¨ 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
  • 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)
  • 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
  • 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
  • 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
  • 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(...)
  • 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, ...)
  • ¨ 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)
  • ¨ Ornek: Tutan Oyuncu Nesnesi def main(): choices = tuple(range(10)) n_items = 4 chooser = Chooser(choices, n_items) ... (plus, minus) = chooser.evaluate(guess) ...
  • ¨ 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
  • ¨ 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)
  • ¨ 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) ...
  • 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
  • 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 ¨
  • ¨ 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): ...
  • ¨ 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
  • ¨ 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
  • ¨ 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
  • ¨ 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)
  • Soyut Taban Sınıflar import abc class ClassName(metaclass=abc.ABCMeta): ... @abc.abstractmethod def method_name(self, ...): ...
  • ¨ 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
  • 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
  • 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
  • ¨ 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?
  • ¨ 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.")
  • 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
  • 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
  • ¨ 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("...")
  • ¨ 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
  • ¨ 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)
  • ¨ 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))
  • 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
  • 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
  • ¨ 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: ...
  • ¨ 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)
  • 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
  • Mod¨ller u her Python kaynak dosyası bir mod¨l u import komutu ile isim uzayına alınabilir
  • ¨ 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(...) ...
  • 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
  • Paketler mod¨ller paketlere toplanabilir u her paket bir klas¨r o
  • ¨ 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
  • ¨ Ornek: Rasgele Tahminci from mastermind.guessers.random import RandomGuesser def main(): ... guesser = RandomGuesser(...) ...
  • 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): ...
  • 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)