Pola Desain Python - Panduan Cepat
Pola desain digunakan untuk merepresentasikan pola yang digunakan oleh pengembang untuk membuat perangkat lunak atau aplikasi web. Pola-pola ini dipilih berdasarkan analisis kebutuhan. Pola tersebut menggambarkan solusi untuk masalah, kapan dan di mana menerapkan solusi tersebut dan konsekuensi dari implementasinya.
Struktur pola desain
Pendokumentasian pola desain dipertahankan dengan cara yang lebih menitikberatkan pada teknologi yang digunakan dan dengan cara apa. Diagram berikut menjelaskan struktur dasar dokumentasi pola desain.
Nama Pola
Ini menggambarkan pola secara singkat dan efektif.
Maksud / Motif
Ini menjelaskan apa yang dilakukan polanya.
Penerapan
Ini menjelaskan daftar situasi di mana pola dapat diterapkan.
Peserta dan konsekuensi
Peserta memasukkan kelas dan objek yang berpartisipasi dalam pola desain dengan daftar konsekuensi yang ada dengan pola tersebut.
Mengapa Python?
Python adalah bahasa skrip open source. Ini memiliki perpustakaan yang mendukung berbagai pola desain. Sintaks python mudah dipahami dan menggunakan kata kunci bahasa Inggris.
Python memberikan dukungan untuk daftar pola desain yang disebutkan di bawah ini. Pola desain ini akan digunakan sepanjang tutorial ini -
- Pola Pengontrol Tampilan Model
- Pola tunggal
- Pola pabrik
- Pola Pembangun
- Pola Prototipe
- Pola Fasad
- Pola Perintah
- Pola Adaptor
- Pola Prototipe
- Pola Dekorator
- Pola Proksi
- Pola Rantai Tanggung Jawab
- Pola Pengamat
- Pola Status
- Pola Strategi
- Pola Template
- Pola Kelas Terbang
- Pola Pabrik Abstrak
- Pola Berorientasi Objek
Manfaat menggunakan pola desain
Berikut adalah manfaat yang berbeda dari pola desain -
Pola memberi pengembang pilihan solusi yang telah dicoba dan diuji untuk masalah yang ditentukan.
Semua pola desain netral bahasa.
Pola membantu mencapai komunikasi dan memelihara dokumentasi dengan baik.
Ini mencakup catatan pencapaian untuk mengurangi risiko teknis pada proyek.
Pola desain sangat fleksibel untuk digunakan dan mudah dipahami.
Python adalah bahasa skrip sumber terbuka, yang tingkat tinggi, ditafsirkan, interaktif dan berorientasi objek. Ini dirancang agar sangat mudah dibaca. Sintaks bahasa Python mudah dipahami dan sering menggunakan kata kunci bahasa Inggris.
Fitur Bahasa Python
Di bagian ini, kita akan belajar tentang berbagai fitur bahasa Python.
Ditafsirkan
Python diproses saat runtime menggunakan interpreter. Tidak perlu mengkompilasi program sebelum dieksekusi. Ini mirip dengan PERL dan PHP.
Berorientasi pada objek
Python mengikuti gaya dan pola desain berorientasi objek. Ini mencakup definisi kelas dengan berbagai fitur seperti enkapsulasi, polimorfisme, dan banyak lagi.
Portabel
Kode Python ditulis dalam sistem operasi Windows dan dapat digunakan di sistem operasi Mac. Kode dapat digunakan kembali dan portabel sesuai kebutuhan.
Mudah untuk dikodekan
Sintaks Python mudah dipahami dan dikodekan. Setiap pengembang dapat memahami sintaks Python dalam beberapa jam. Python dapat dideskripsikan sebagai "ramah programmer"
Dapat diperluas
Jika diperlukan, pengguna dapat menulis beberapa kode Python dalam bahasa C. Dimungkinkan juga untuk meletakkan kode python dalam kode sumber dalam berbagai bahasa seperti C ++. Ini membuat Python menjadi bahasa yang bisa dikembangkan.
Poin Penting
Simak poin-poin penting berikut terkait bahasa pemrograman Python -
Ini mencakup metode pemrograman fungsional dan terstruktur serta metode pemrograman berorientasi objek.
Ini dapat digunakan sebagai bahasa scripting atau sebagai bahasa pemrograman.
Ini termasuk pengumpulan sampah otomatis.
Ini mencakup tipe data dinamis tingkat tinggi dan mendukung berbagai pemeriksaan tipe dinamis.
Python menyertakan fitur integrasi dengan C, C ++ dan bahasa seperti Java.
Bagaimana cara mengunduh bahasa python di sistem Anda?
Untuk mengunduh bahasa Python di sistem Anda, ikuti tautan ini -
https://www.python.org/downloads/Ini termasuk paket untuk berbagai sistem operasi seperti distribusi Windows, MacOS dan Linux.
Alat Penting dengan Python
Di bagian ini, kita akan belajar secara singkat tentang beberapa alat penting di Python.
String Python
Deklarasi dasar string adalah sebagai berikut -
str = 'Hello World!'
Daftar Python
Daftar python dapat dideklarasikan sebagai tipe data gabungan yang dipisahkan dengan koma dan diapit oleh tanda kurung siku ([]).
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
Python Tuple
Tuple adalah tipe data dinamis dari Python, yang terdiri dari sejumlah nilai yang dipisahkan dengan koma. Tupel diapit dengan tanda kurung.
tinytuple = (123, 'john')
Kamus Python
Kamus Python adalah jenis tabel hash. Kunci kamus bisa berupa hampir semua tipe data Python. Tipe data biasanya angka atau string.
tinydict = {'name': 'omkar','code':6734, 'dept': 'sales'}
Apa yang dimaksud dengan pola desain dengan Python?
Python membantu dalam membentuk pola desain menggunakan parameter berikut -
- Nama Pola
- Intent
- Aliases
- Motivation
- Problem
- Solution
- Structure
- Participants
- Constraints
- Kode sampel
Model View Controller adalah pola desain yang paling umum digunakan. Pengembang merasa mudah untuk menerapkan pola desain ini.
Berikut ini adalah arsitektur dasar dari Model View Controller -
Sekarang mari kita lihat bagaimana struktur itu bekerja.
Model
Ini terdiri dari logika aplikasi murni, yang berinteraksi dengan database. Ini mencakup semua informasi untuk merepresentasikan data kepada pengguna akhir.
Melihat
View mewakili file HTML, yang berinteraksi dengan pengguna akhir. Ini mewakili data model kepada pengguna.
Kontroler
Ini bertindak sebagai perantara antara tampilan dan model. Ini mendengarkan peristiwa yang dipicu oleh tampilan dan model kueri untuk hal yang sama.
Kode Python
Mari kita pertimbangkan objek dasar yang disebut "Orang" dan membuat pola desain MVC.
Model.py
import json
class Person(object):
def __init__(self, first_name = None, last_name = None):
self.first_name = first_name
self.last_name = last_name
#returns Person name, ex: John Doe
def name(self):
return ("%s %s" % (self.first_name,self.last_name))
@classmethod
#returns all people inside db.txt as list of Person objects
def getAll(self):
database = open('db.txt', 'r')
result = []
json_list = json.loads(database.read())
for item in json_list:
item = json.loads(item)
person = Person(item['first_name'], item['last_name'])
result.append(person)
return result
Ini memanggil sebuah metode, yang mengambil semua record dari tabel Person dalam database. Catatan disajikan dalam format JSON.
Melihat
Ini menampilkan semua catatan yang diambil dalam model. Tampilan tidak pernah berinteraksi dengan model; controller melakukan pekerjaan ini (berkomunikasi dengan model dan tampilan).
from model import Person
def showAllView(list):
print 'In our db we have %i users. Here they are:' % len(list)
for item in list:
print item.name()
def startView():
print 'MVC - the simplest example'
print 'Do you want to see everyone in my db?[y/n]'
def endView():
print 'Goodbye!'
Kontroler
Kontroler berinteraksi dengan model melalui getAll() metode yang mengambil semua catatan yang ditampilkan kepada pengguna akhir.
from model import Person
import view
def showAll():
#gets list of all Person objects
people_in_db = Person.getAll()
#calls view
return view.showAllView(people_in_db)
def start():
view.startView()
input = raw_input()
if input == 'y':
return showAll()
else:
return view.endView()
if __name__ == "__main__":
#running controller function
start()
Pola ini membatasi instansiasi kelas ke satu objek. Ini adalah jenis pola kreasi dan hanya melibatkan satu kelas untuk membuat metode dan objek tertentu.
Ini memberikan titik akses global ke instance yang dibuat.
Bagaimana cara menerapkan kelas tunggal?
Program berikut mendemonstrasikan implementasi kelas singleton yang mencetak instance yang dibuat beberapa kali.
class Singleton:
__instance = None
@staticmethod
def getInstance():
""" Static access method. """
if Singleton.__instance == None:
Singleton()
return Singleton.__instance
def __init__(self):
""" Virtually private constructor. """
if Singleton.__instance != None:
raise Exception("This class is a singleton!")
else:
Singleton.__instance = self
s = Singleton()
print s
s = Singleton.getInstance()
print s
s = Singleton.getInstance()
print s
Keluaran
Program di atas menghasilkan keluaran berikut -
Jumlah instance yang dibuat sama dan tidak ada perbedaan dalam objek yang tercantum dalam output.
Pola pabrik berada di bawah kategori daftar pola kreasi. Ini memberikan salah satu cara terbaik untuk membuat objek. Dalam pola pabrik, objek dibuat tanpa mengekspos logika ke klien dan merujuk ke objek yang baru dibuat menggunakan antarmuka umum.
Pola pabrik diimplementasikan dengan Python menggunakan metode pabrik. Ketika seorang pengguna memanggil metode sedemikian rupa sehingga kami mengirimkan string dan nilai yang dikembalikan sebagai objek baru diimplementasikan melalui metode pabrik. Jenis objek yang digunakan dalam metode pabrik ditentukan oleh string yang melewati metode.
Pada contoh di bawah ini, setiap metode menyertakan objek sebagai parameter, yang diimplementasikan melalui metode pabrik.
Bagaimana cara menerapkan pola pabrik?
Sekarang mari kita lihat bagaimana menerapkan pola pabrik.
class Button(object):
html = ""
def get_html(self):
return self.html
class Image(Button):
html = "<img></img>"
class Input(Button):
html = "<input></input>"
class Flash(Button):
html = "<obj></obj>"
class ButtonFactory():
def create_button(self, typ):
targetclass = typ.capitalize()
return globals()[targetclass]()
button_obj = ButtonFactory()
button = ['image', 'input', 'flash']
for b in button:
print button_obj.create_button(b).get_html()
Kelas tombol membantu membuat tag html dan halaman html terkait. Klien tidak akan memiliki akses ke logika kode dan outputnya mewakili pembuatan halaman html.
Keluaran
Penjelasan
Kode python menyertakan logika tag html, yang nilainya ditentukan. Pengguna akhir dapat melihat file HTML yang dibuat oleh kode Python.
Builder Pattern adalah pola desain unik yang membantu dalam membangun objek kompleks dengan menggunakan objek sederhana dan menggunakan pendekatan algoritmik. Pola desain ini termasuk dalam kategori pola kreasi. Dalam pola desain ini, kelas pembangun membuat objek akhir dalam prosedur langkah demi langkah. Pembangun ini tidak bergantung pada objek lain.
Keuntungan dari Pola Builder
Ini memberikan pemisahan yang jelas dan lapisan unik antara konstruksi dan representasi objek tertentu yang dibuat oleh kelas.
Ini memberikan kontrol yang lebih baik atas proses konstruksi dari pola yang dibuat.
Ini memberikan skenario yang sempurna untuk mengubah representasi internal objek.
Bagaimana cara menerapkan pola pembangun?
Pada bagian ini, kita akan belajar bagaimana mengimplementasikan pola builder.
class Director:
__builder = None
def setBuilder(self, builder):
self.__builder = builder
def getCar(self):
car = Car()
# First goes the body
body = self.__builder.getBody()
car.setBody(body)
# Then engine
engine = self.__builder.getEngine()
car.setEngine(engine)
# And four wheels
i = 0
while i < 4:
wheel = self.__builder.getWheel()
car.attachWheel(wheel)
i += 1
return car
# The whole product
class Car:
def __init__(self):
self.__wheels = list()
self.__engine = None
self.__body = None
def setBody(self, body):
self.__body = body
def attachWheel(self, wheel):
self.__wheels.append(wheel)
def setEngine(self, engine):
self.__engine = engine
def specification(self):
print "body: %s" % self.__body.shape
print "engine horsepower: %d" % self.__engine.horsepower
print "tire size: %d\'" % self.__wheels[0].size
class Builder:
def getWheel(self): pass
def getEngine(self): pass
def getBody(self): pass
class JeepBuilder(Builder):
def getWheel(self):
wheel = Wheel()
wheel.size = 22
return wheel
def getEngine(self):
engine = Engine()
engine.horsepower = 400
return engine
def getBody(self):
body = Body()
body.shape = "SUV"
return body
# Car parts
class Wheel:
size = None
class Engine:
horsepower = None
class Body:
shape = None
def main():
jeepBuilder = JeepBuilder() # initializing the class
director = Director()
# Build Jeep
print "Jeep"
director.setBuilder(jeepBuilder)
jeep = director.getCar()
jeep.specification()
print ""
if __name__ == "__main__":
main()
Keluaran
Program di atas menghasilkan keluaran berikut -
Pola desain prototipe membantu menyembunyikan kompleksitas instance yang dibuat oleh kelas. Konsep objek yang ada akan berbeda dengan objek baru yang dibuat dari awal.
Objek yang baru disalin mungkin memiliki beberapa perubahan pada properti jika diperlukan. Pendekatan ini menghemat waktu dan sumber daya yang digunakan untuk pengembangan produk.
Bagaimana cara menerapkan pola prototipe?
Sekarang mari kita lihat bagaimana menerapkan pola prototipe.
import copy
class Prototype:
_type = None
_value = None
def clone(self):
pass
def getType(self):
return self._type
def getValue(self):
return self._value
class Type1(Prototype):
def __init__(self, number):
self._type = "Type1"
self._value = number
def clone(self):
return copy.copy(self)
class Type2(Prototype):
""" Concrete prototype. """
def __init__(self, number):
self._type = "Type2"
self._value = number
def clone(self):
return copy.copy(self)
class ObjectFactory:
""" Manages prototypes.
Static factory, that encapsulates prototype
initialization and then allows instatiation
of the classes from these prototypes.
"""
__type1Value1 = None
__type1Value2 = None
__type2Value1 = None
__type2Value2 = None
@staticmethod
def initialize():
ObjectFactory.__type1Value1 = Type1(1)
ObjectFactory.__type1Value2 = Type1(2)
ObjectFactory.__type2Value1 = Type2(1)
ObjectFactory.__type2Value2 = Type2(2)
@staticmethod
def getType1Value1():
return ObjectFactory.__type1Value1.clone()
@staticmethod
def getType1Value2():
return ObjectFactory.__type1Value2.clone()
@staticmethod
def getType2Value1():
return ObjectFactory.__type2Value1.clone()
@staticmethod
def getType2Value2():
return ObjectFactory.__type2Value2.clone()
def main():
ObjectFactory.initialize()
instance = ObjectFactory.getType1Value1()
print "%s: %s" % (instance.getType(), instance.getValue())
instance = ObjectFactory.getType1Value2()
print "%s: %s" % (instance.getType(), instance.getValue())
instance = ObjectFactory.getType2Value1()
print "%s: %s" % (instance.getType(), instance.getValue())
instance = ObjectFactory.getType2Value2()
print "%s: %s" % (instance.getType(), instance.getValue())
if __name__ == "__main__":
main()
Keluaran
Program di atas akan menghasilkan keluaran sebagai berikut -
Output membantu dalam membuat objek baru dengan yang sudah ada dan terlihat jelas dalam output yang disebutkan di atas.
Pola desain fasad menyediakan antarmuka terpadu ke satu set antarmuka dalam subsistem. Ini mendefinisikan antarmuka tingkat tinggi yang dapat digunakan subsistem apa pun.
Kelas fasad mengetahui subsistem mana yang bertanggung jawab atas permintaan.
Bagaimana cara mendesain pola fasad?
Sekarang mari kita lihat bagaimana mendesain pola fasad.
class _IgnitionSystem(object):
@staticmethod
def produce_spark():
return True
class _Engine(object):
def __init__(self):
self.revs_per_minute = 0
def turnon(self):
self.revs_per_minute = 2000
def turnoff(self):
self.revs_per_minute = 0
class _FuelTank(object):
def __init__(self, level=30):
self._level = level
@property
def level(self):
return self._level
@level.setter
def level(self, level):
self._level = level
class _DashBoardLight(object):
def __init__(self, is_on=False):
self._is_on = is_on
def __str__(self):
return self.__class__.__name__
@property
def is_on(self):
return self._is_on
@is_on.setter
def is_on(self, status):
self._is_on = status
def status_check(self):
if self._is_on:
print("{}: ON".format(str(self)))
else:
print("{}: OFF".format(str(self)))
class _HandBrakeLight(_DashBoardLight):
pass
class _FogLampLight(_DashBoardLight):
pass
class _Dashboard(object):
def __init__(self):
self.lights = {"handbreak": _HandBrakeLight(), "fog": _FogLampLight()}
def show(self):
for light in self.lights.values():
light.status_check()
# Facade
class Car(object):
def __init__(self):
self.ignition_system = _IgnitionSystem()
self.engine = _Engine()
self.fuel_tank = _FuelTank()
self.dashboard = _Dashboard()
@property
def km_per_litre(self):
return 17.0
def consume_fuel(self, km):
litres = min(self.fuel_tank.level, km / self.km_per_litre)
self.fuel_tank.level -= litres
def start(self):
print("\nStarting...")
self.dashboard.show()
if self.ignition_system.produce_spark():
self.engine.turnon()
else:
print("Can't start. Faulty ignition system")
def has_enough_fuel(self, km, km_per_litre):
litres_needed = km / km_per_litre
if self.fuel_tank.level > litres_needed:
return True
else:
return False
def drive(self, km = 100):
print("\n")
if self.engine.revs_per_minute > 0:
while self.has_enough_fuel(km, self.km_per_litre):
self.consume_fuel(km)
print("Drove {}km".format(km))
print("{:.2f}l of fuel still left".format(self.fuel_tank.level))
else:
print("Can't drive. The Engine is turned off!")
def park(self):
print("\nParking...")
self.dashboard.lights["handbreak"].is_on = True
self.dashboard.show()
self.engine.turnoff()
def switch_fog_lights(self, status):
print("\nSwitching {} fog lights...".format(status))
boolean = True if status == "ON" else False
self.dashboard.lights["fog"].is_on = boolean
self.dashboard.show()
def fill_up_tank(self):
print("\nFuel tank filled up!")
self.fuel_tank.level = 100
# the main function is the Client
def main():
car = Car()
car.start()
car.drive()
car.switch_fog_lights("ON")
car.switch_fog_lights("OFF")
car.park()
car.fill_up_tank()
car.drive()
car.start()
car.drive()
if __name__ == "__main__":
main()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Program ini dirancang dengan skenario. Ini adalah menghidupkan mesin mobil atau kendaraan penggerak apa pun. Jika Anda mengamati kodenya, itu termasuk fungsi terkait untuk mengemudi, memarkir dan mengkonsumsi bahan bakar juga.
Pola Perintah menambahkan tingkat abstraksi antar tindakan dan menyertakan objek, yang memanggil tindakan ini.
Dalam pola desain ini, klien membuat objek perintah yang menyertakan daftar perintah yang akan dijalankan. Objek perintah yang dibuat mengimplementasikan antarmuka tertentu.
Berikut adalah arsitektur dasar dari pola perintah -
Bagaimana cara menerapkan pola perintah?
Sekarang kita akan melihat bagaimana mengimplementasikan pola desain.
def demo(a,b,c):
print 'a:',a
print 'b:',b
print 'c:',c
class Command:
def __init__(self, cmd, *args):
self._cmd=cmd
self._args=args
def __call__(self, *args):
return apply(self._cmd, self._args+args)
cmd = Command(dir,__builtins__)
print cmd()
cmd = Command(demo,1,2)
cmd(3)
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Outputnya mengimplementasikan semua perintah dan kata kunci yang terdaftar dalam bahasa Python. Ini mencetak nilai variabel yang diperlukan.
Pola adaptor berfungsi sebagai jembatan antara dua antarmuka yang tidak kompatibel. Jenis pola desain ini berada di bawah pola struktural karena pola ini menggabungkan kemampuan dua antarmuka independen.
Pola ini melibatkan satu kelas, yang bertanggung jawab untuk menggabungkan fungsionalitas antarmuka yang independen atau tidak kompatibel. Contoh kehidupan nyata dapat berupa kasus pembaca kartu, yang bertindak sebagai adaptor antara kartu memori dan laptop. Anda mencolokkan kartu memori ke dalam pembaca kartu dan pembaca kartu ke laptop sehingga kartu memori dapat dibaca melalui laptop.
Pola desain adaptor membantu mengerjakan kelas bersama-sama. Ini mengubah antarmuka kelas menjadi antarmuka lain berdasarkan kebutuhan. Pola tersebut mencakup spesiasi polimorfisme yang menamai satu nama dan beberapa bentuk. Katakanlah untuk kelas bentuk yang dapat digunakan sesuai persyaratan yang dikumpulkan.
Ada dua jenis pola adaptor -
Pola Adaptor Objek
Pola desain ini bergantung pada implementasi objek. Karenanya, ini disebut Pola Adaptor Objek.
Pola Adaptor Kelas
Ini adalah cara alternatif untuk mengimplementasikan pola desain adaptor. Pola tersebut dapat diimplementasikan menggunakan beberapa pewarisan.
Bagaimana cara menerapkan pola adaptor?
Sekarang mari kita lihat bagaimana menerapkan pola adaptor.
class EuropeanSocketInterface:
def voltage(self): pass
def live(self): pass
def neutral(self): pass
def earth(self): pass
# Adaptee
class Socket(EuropeanSocketInterface):
def voltage(self):
return 230
def live(self):
return 1
def neutral(self):
return -1
def earth(self):
return 0
# Target interface
class USASocketInterface:
def voltage(self): pass
def live(self): pass
def neutral(self): pass
# The Adapter
class Adapter(USASocketInterface):
__socket = None
def __init__(self, socket):
self.__socket = socket
def voltage(self):
return 110
def live(self):
return self.__socket.live()
def neutral(self):
return self.__socket.neutral()
# Client
class ElectricKettle:
__power = None
def __init__(self, power):
self.__power = power
def boil(self):
if self.__power.voltage() > 110:
print "Kettle on fire!"
else:
if self.__power.live() == 1 and \
self.__power.neutral() == -1:
print "Coffee time!"
else:
print "No power."
def main():
# Plug in
socket = Socket()
adapter = Adapter(socket)
kettle = ElectricKettle(adapter)
# Make coffee
kettle.boil()
return 0
if __name__ == "__main__":
main()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Kode tersebut mencakup antarmuka adaptor dengan berbagai parameter dan atribut. Ini termasuk Adaptee bersama dengan antarmuka Target yang mengimplementasikan semua atribut dan menampilkan keluaran sebagai terlihat.
Pola dekorator memungkinkan pengguna menambahkan fungsionalitas baru ke objek yang sudah ada tanpa mengubah strukturnya. Jenis pola desain ini berada di bawah pola struktural karena pola ini bertindak sebagai pembungkus kelas yang ada.
Pola ini membuat kelas dekorator, yang membungkus kelas asli dan menyediakan fungsionalitas tambahan yang menjaga agar tanda tangan metode kelas tetap utuh.
Motif pola dekorator adalah untuk melampirkan tanggung jawab tambahan dari suatu objek secara dinamis.
Bagaimana menerapkan pola desain dekorator
Kode yang disebutkan di bawah ini adalah demonstrasi sederhana tentang bagaimana menerapkan pola desain dekorator dengan Python. Ilustrasi tersebut melibatkan demonstrasi kedai kopi dalam format kelas. Kelas kopi yang dibuat adalah abstrak, yang artinya tidak dapat dibuat instance-nya.
import six
from abc import ABCMeta
@six.add_metaclass(ABCMeta)
class Abstract_Coffee(object):
def get_cost(self):
pass
def get_ingredients(self):
pass
def get_tax(self):
return 0.1*self.get_cost()
class Concrete_Coffee(Abstract_Coffee):
def get_cost(self):
return 1.00
def get_ingredients(self):
return 'coffee'
@six.add_metaclass(ABCMeta)
class Abstract_Coffee_Decorator(Abstract_Coffee):
def __init__(self,decorated_coffee):
self.decorated_coffee = decorated_coffee
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients()
class Sugar(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', sugar'
class Milk(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.25
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', milk'
class Vanilla(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.75
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', vanilla'
Implementasi kelas abstrak dari kedai kopi dilakukan dengan file terpisah seperti yang disebutkan di bawah ini -
import coffeeshop
myCoffee = coffeeshop.Concrete_Coffee()
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Milk(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Vanilla(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Sugar(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
Keluaran
Program di atas menghasilkan keluaran berikut -
Pola desain proxy menyertakan objek baru, yang disebut "Proxy" menggantikan objek yang sudah ada yang disebut "Subjek Nyata". Objek proxy yang dibuat dari subjek nyata harus berada pada antarmuka yang sama sedemikian rupa sehingga klien tidak boleh mendapatkan ide bahwa proxy digunakan sebagai pengganti objek sebenarnya. Permintaan yang dibuat oleh klien ke proxy diteruskan melalui subjek yang sebenarnya.
Representasi UML dari pola proxy adalah sebagai berikut -
Bagaimana cara menerapkan pola proxy?
Sekarang mari kita lihat bagaimana menerapkan pola proxy.
class Image:
def __init__( self, filename ):
self._filename = filename
def load_image_from_disk( self ):
print("loading " + self._filename )
def display_image( self ):
print("display " + self._filename)
class Proxy:
def __init__( self, subject ):
self._subject = subject
self._proxystate = None
class ProxyImage( Proxy ):
def display_image( self ):
if self._proxystate == None:
self._subject.load_image_from_disk()
self._proxystate = 1
print("display " + self._subject._filename )
proxy_image1 = ProxyImage ( Image("HiRes_10Mb_Photo1") )
proxy_image2 = ProxyImage ( Image("HiRes_10Mb_Photo2") )
proxy_image1.display_image() # loading necessary
proxy_image1.display_image() # loading unnecessary
proxy_image2.display_image() # loading necessary
proxy_image2.display_image() # loading unnecessary
proxy_image1.display_image() # loading unnecessary
Keluaran
Program di atas menghasilkan keluaran berikut -
Desain pola proxy membantu dalam mereplikasi gambar yang kita buat. Fungsi display_image () membantu untuk memeriksa apakah nilai dicetak pada prompt perintah.
Pola rantai tanggung jawab digunakan untuk mencapai kopling longgar dalam perangkat lunak di mana permintaan tertentu dari klien diteruskan melalui rantai objek yang termasuk di dalamnya. Ini membantu dalam membangun rantai objek. Permintaan masuk dari satu ujung dan berpindah dari satu objek ke objek lainnya.
Pola ini memungkinkan objek mengirimkan perintah tanpa mengetahui objek mana yang akan menangani permintaan tersebut.
Bagaimana menerapkan pola rantai tanggung jawab?
Sekarang kita akan melihat bagaimana menerapkan pola rantai tanggung jawab.
class ReportFormat(object):
PDF = 0
TEXT = 1
class Report(object):
def __init__(self, format_):
self.title = 'Monthly report'
self.text = ['Things are going', 'really, really well.']
self.format_ = format_
class Handler(object):
def __init__(self):
self.nextHandler = None
def handle(self, request):
self.nextHandler.handle(request)
class PDFHandler(Handler):
def handle(self, request):
if request.format_ == ReportFormat.PDF:
self.output_report(request.title, request.text)
else:
super(PDFHandler, self).handle(request)
def output_report(self, title, text):
print '<html>'
print ' <head>'
print ' <title>%s</title>' % title
print ' </head>'
print ' <body>'
for line in text:
print ' <p>%s' % line
print ' </body>'
print '</html>'
class TextHandler(Handler):
def handle(self, request):
if request.format_ == ReportFormat.TEXT:
self.output_report(request.title, request.text)
else:
super(TextHandler, self).handle(request)
def output_report(self, title, text):
print 5*'*' + title + 5*'*'
for line in text:
print line
class ErrorHandler(Handler):
def handle(self, request):
print "Invalid request"
if __name__ == '__main__':
report = Report(ReportFormat.TEXT)
pdf_handler = PDFHandler()
text_handler = TextHandler()
pdf_handler.nextHandler = text_handler
text_handler.nextHandler = ErrorHandler()
pdf_handler.handle(report)
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Kode di atas membuat laporan untuk tugas bulanan yang mengirimkan perintah melalui setiap fungsi. Dibutuhkan dua penangan - untuk PDF dan untuk teks. Ini mencetak output setelah objek yang diperlukan menjalankan setiap fungsi.
Dalam pola ini, objek direpresentasikan sebagai pengamat yang menunggu peristiwa dipicu. Seorang pengamat menempel pada subjek setelah peristiwa tertentu terjadi. Saat peristiwa itu terjadi, subjek memberi tahu pengamat bahwa peristiwa itu telah terjadi.
Diagram UML berikut merepresentasikan pola pengamat -
Bagaimana cara menerapkan pola pengamat?
Sekarang mari kita lihat bagaimana menerapkan pola pengamat.
import threading
import time
import pdb
class Downloader(threading.Thread):
def run(self):
print 'downloading'
for i in range(1,5):
self.i = i
time.sleep(2)
print 'unfunf'
return 'hello world'
class Worker(threading.Thread):
def run(self):
for i in range(1,5):
print 'worker running: %i (%i)' % (i, t.i)
time.sleep(1)
t.join()
print 'done'
t = Downloader()
t.start()
time.sleep(1)
t1 = Worker()
t1.start()
t2 = Worker()
t2.start()
t3 = Worker()
t3.start()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Kode di atas menjelaskan prosedur mengunduh hasil tertentu. Sesuai logika pola pengamat, setiap objek diperlakukan sebagai pengamat. Ini mencetak output ketika acara dipicu.
Ini menyediakan modul untuk mesin negara, yang diimplementasikan menggunakan subclass, yang berasal dari kelas mesin negara yang ditentukan. Metode ini tidak bergantung negara dan menyebabkan transisi dideklarasikan menggunakan dekorator.
Bagaimana cara menerapkan pola negara?
Implementasi dasar dari pola negara ditunjukkan di bawah ini -
class ComputerState(object):
name = "state"
allowed = []
def switch(self, state):
""" Switch to new state """
if state.name in self.allowed:
print 'Current:',self,' => switched to new state',state.name
self.__class__ = state
else:
print 'Current:',self,' => switching to',state.name,'not possible.'
def __str__(self):
return self.name
class Off(ComputerState):
name = "off"
allowed = ['on']
class On(ComputerState):
""" State of being powered on and working """
name = "on"
allowed = ['off','suspend','hibernate']
class Suspend(ComputerState):
""" State of being in suspended mode after switched on """
name = "suspend"
allowed = ['on']
class Hibernate(ComputerState):
""" State of being in hibernation after powered on """
name = "hibernate"
allowed = ['on']
class Computer(object):
""" A class representing a computer """
def __init__(self, model='HP'):
self.model = model
# State of the computer - default is off.
self.state = Off()
def change(self, state):
""" Change state """
self.state.switch(state)
if __name__ == "__main__":
comp = Computer()
comp.change(On)
comp.change(Off)
comp.change(On)
comp.change(Suspend)
comp.change(Hibernate)
comp.change(On)
comp.change(Off)
Keluaran
Program di atas menghasilkan keluaran berikut -
Pola strategi adalah jenis pola perilaku. Tujuan utama dari pola strategi adalah untuk memungkinkan klien memilih dari berbagai algoritma atau prosedur untuk menyelesaikan tugas yang ditentukan. Algoritme yang berbeda dapat ditukar masuk dan keluar tanpa komplikasi untuk tugas yang disebutkan.
Pola ini dapat digunakan untuk meningkatkan fleksibilitas saat sumber daya eksternal diakses.
Bagaimana cara menerapkan pola strategi?
Program yang ditunjukkan di bawah ini membantu dalam menerapkan pola strategi.
import types
class StrategyExample:
def __init__(self, func = None):
self.name = 'Strategy Example 0'
if func is not None:
self.execute = types.MethodType(func, self)
def execute(self):
print(self.name)
def execute_replacement1(self):
print(self.name + 'from execute 1')
def execute_replacement2(self):
print(self.name + 'from execute 2')
if __name__ == '__main__':
strat0 = StrategyExample()
strat1 = StrategyExample(execute_replacement1)
strat1.name = 'Strategy Example 1'
strat2 = StrategyExample(execute_replacement2)
strat2.name = 'Strategy Example 2'
strat0.execute()
strat1.execute()
strat2.execute()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Ini memberikan daftar strategi dari fungsi, yang menjalankan output. Fokus utama dari pola perilaku ini adalah perilaku.
Pola templat mendefinisikan algoritme dasar dalam kelas dasar menggunakan operasi abstrak di mana subkelas menggantikan perilaku konkret. Pola templat menyimpan kerangka algoritme dalam metode terpisah. Metode ini disebut sebagai metode templat.
Berikut adalah fitur-fitur berbeda dari pola templat -
Ini mendefinisikan kerangka algoritma dalam suatu operasi
Ini termasuk subclass, yang mendefinisikan ulang langkah-langkah tertentu dari suatu algoritma.
class MakeMeal:
def prepare(self): pass
def cook(self): pass
def eat(self): pass
def go(self):
self.prepare()
self.cook()
self.eat()
class MakePizza(MakeMeal):
def prepare(self):
print "Prepare Pizza"
def cook(self):
print "Cook Pizza"
def eat(self):
print "Eat Pizza"
class MakeTea(MakeMeal):
def prepare(self):
print "Prepare Tea"
def cook(self):
print "Cook Tea"
def eat(self):
print "Eat Tea"
makePizza = MakePizza()
makePizza.go()
print 25*"+"
makeTea = MakeTea()
makeTea.go()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Kode ini membuat template untuk menyiapkan makanan. Di sini, setiap parameter mewakili atribut untuk membuat bagian dari makanan seperti teh, pizza, dll.
Outputnya merepresentasikan visualisasi atribut.
Pola kelas terbang berada di bawah kategori pola desain struktural. Ini memberikan cara untuk mengurangi jumlah objek. Ini mencakup berbagai fitur yang membantu dalam meningkatkan struktur aplikasi. Fitur terpenting dari objek kelas terbang adalah kekekalan. Ini berarti bahwa mereka tidak dapat dimodifikasi setelah dibuat. Pola tersebut menggunakan HashMap untuk menyimpan objek referensi.
Bagaimana cara menerapkan pola kelas terbang?
Program berikut membantu dalam menerapkan pola kelas terbang -
class ComplexGenetics(object):
def __init__(self):
pass
def genes(self, gene_code):
return "ComplexPatter[%s]TooHugeinSize" % (gene_code)
class Families(object):
family = {}
def __new__(cls, name, family_id):
try:
id = cls.family[family_id]
except KeyError:
id = object.__new__(cls)
cls.family[family_id] = id
return id
def set_genetic_info(self, genetic_info):
cg = ComplexGenetics()
self.genetic_info = cg.genes(genetic_info)
def get_genetic_info(self):
return (self.genetic_info)
def test():
data = (('a', 1, 'ATAG'), ('a', 2, 'AAGT'), ('b', 1, 'ATAG'))
family_objects = []
for i in data:
obj = Families(i[0], i[1])
obj.set_genetic_info(i[2])
family_objects.append(obj)
for i in family_objects:
print "id = " + str(id(i))
print i.get_genetic_info()
print "similar id's says that they are same objects "
if __name__ == '__main__':
test()
Keluaran
Program di atas menghasilkan keluaran berikut -
Pola pabrik yang abstrak juga disebut pabrik pabrik. Pola desain ini termasuk dalam kategori pola desain kreasi. Ini memberikan salah satu cara terbaik untuk membuat objek.
Ini termasuk antarmuka, yang bertanggung jawab untuk membuat objek yang terkait dengan Pabrik.
Bagaimana cara menerapkan pola pabrik abstrak?
Program berikut membantu dalam mengimplementasikan pola pabrik abstrak.
class Window:
__toolkit = ""
__purpose = ""
def __init__(self, toolkit, purpose):
self.__toolkit = toolkit
self.__purpose = purpose
def getToolkit(self):
return self.__toolkit
def getType(self):
return self.__purpose
class GtkToolboxWindow(Window):
def __init__(self):
Window.__init__(self, "Gtk", "ToolboxWindow")
class GtkLayersWindow(Window):
def __init__(self):
Window.__init__(self, "Gtk", "LayersWindow")
class GtkMainWindow(Window):
def __init__(self):
Window.__init__(self, "Gtk", "MainWindow")
class QtToolboxWindow(Window):
def __init__(self):
Window.__init__(self, "Qt", "ToolboxWindow")
class QtLayersWindow(Window):
def __init__(self):
Window.__init__(self, "Qt", "LayersWindow")
class QtMainWindow(Window):
def __init__(self):
Window.__init__(self, "Qt", "MainWindow")
# Abstract factory class
class UIFactory:
def getToolboxWindow(self): pass
def getLayersWindow(self): pass
def getMainWindow(self): pass
class GtkUIFactory(UIFactory):
def getToolboxWindow(self):
return GtkToolboxWindow()
def getLayersWindow(self):
return GtkLayersWindow()
def getMainWindow(self):
return GtkMainWindow()
class QtUIFactory(UIFactory):
def getToolboxWindow(self):
return QtToolboxWindow()
def getLayersWindow(self):
return QtLayersWindow()
def getMainWindow(self):
return QtMainWindow()
if __name__ == "__main__":
gnome = True
kde = not gnome
if gnome:
ui = GtkUIFactory()
elif kde:
ui = QtUIFactory()
toolbox = ui.getToolboxWindow()
layers = ui.getLayersWindow()
main = ui.getMainWindow()
print "%s:%s" % (toolbox.getToolkit(), toolbox.getType())
print "%s:%s" % (layers.getToolkit(), layers.getType())
print "%s:%s" % (main.getToolkit(), main.getType())
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Dalam program di atas, pabrik abstrak membuat objek untuk setiap jendela. Ini memanggil setiap metode, yang mengeksekusi keluaran seperti yang diharapkan.
Pola berorientasi objek adalah pola yang paling umum digunakan. Pola ini bisa ditemukan di hampir semua bahasa pemrograman.
Bagaimana cara menerapkan pola berorientasi objek?
Sekarang mari kita lihat bagaimana mengimplementasikan pola berorientasi objek.
class Parrot:
# class attribute
species = "bird"
# instance attribute
def __init__(self, name, age):
self.name = name
self.age = age
# instantiate the Parrot class
blu = Parrot("Blu", 10)
woo = Parrot("Woo", 15)
# access the class attributes
print("Blu is a {}".format(blu.__class__.species))
print("Woo is also a {}".format(woo.__class__.species))
# access the instance attributes
print("{} is {} years old".format( blu.name, blu.age))
print("{} is {} years old".format( woo.name, woo.age))
Keluaran
Program di atas menghasilkan keluaran sebagai berikut
Penjelasan
Kode termasuk atribut kelas dan atribut contoh, yang dicetak sesuai kebutuhan output. Ada berbagai fitur yang menjadi bagian dari pola berorientasi objek. Fitur-fiturnya dijelaskan di bab selanjutnya.
Dalam bab ini, kita akan fokus pada pola yang menggunakan konsep berorientasi objek dan implementasinya dengan Python. Ketika kita merancang program kita di sekitar blok pernyataan, yang memanipulasi data di sekitar fungsi, itu disebut pemrograman berorientasi prosedur. Dalam pemrograman berorientasi objek, ada dua contoh utama yang disebut kelas dan objek.
Bagaimana cara menerapkan kelas dan variabel objek?
Implementasi kelas dan variabel objek adalah sebagai berikut -
class Robot:
population = 0
def __init__(self, name):
self.name = name
print("(Initializing {})".format(self.name))
Robot.population += 1
def die(self):
print("{} is being destroyed!".format(self.name))
Robot.population -= 1
if Robot.population == 0:
print("{} was the last one.".format(self.name))
else:
print("There are still {:d} robots working.".format(
Robot.population))
def say_hi(self):
print("Greetings, my masters call me {}.".format(self.name))
@classmethod
def how_many(cls):
print("We have {:d} robots.".format(cls.population))
droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("C-3PO")
droid2.say_hi()
Robot.how_many()
print("\nRobots can do some work here.\n")
print("Robots have finished their work. So let's destroy them.")
droid1.die()
droid2.die()
Robot.how_many()
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
Ilustrasi ini membantu menunjukkan sifat variabel kelas dan objek.
"Populasi" termasuk dalam kelas "Robot". Oleh karena itu, ini disebut sebagai variabel atau objek kelas.
Di sini, kami merujuk ke variabel kelas populasi sebagai Robot.population dan bukan sebagai self.population.
Pola desain iterator termasuk dalam kategori pola desain perilaku. Pengembang menemukan pola iterator di hampir setiap bahasa pemrograman. Pola ini digunakan sedemikian rupa sehingga membantu untuk mengakses elemen dari suatu koleksi (kelas) secara berurutan tanpa memahami desain lapisan yang mendasarinya.
Bagaimana cara menerapkan pola iterator?
Sekarang kita akan melihat bagaimana mengimplementasikan pola iterator.
import time
def fib():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
g = fib()
try:
for e in g:
print(e)
time.sleep(1)
except KeyboardInterrupt:
print("Calculation stopped")
Keluaran
Program di atas menghasilkan keluaran berikut -
Jika Anda fokus pada pola, deret Fibonacci dicetak dengan pola iterator. Pada penghentian paksa pengguna, output berikut akan dicetak -
Penjelasan
Kode python ini mengikuti pola iterator. Di sini, operator increment digunakan untuk memulai penghitungan. Penghitungan berakhir pada penghentian paksa oleh pengguna.
Kamus adalah struktur data, yang menyertakan kombinasi nilai kunci. Ini banyak digunakan sebagai pengganti JSON - JavaScript Object Notation. Kamus digunakan untuk pemrograman API (Application Programming Interface). Kamus memetakan sekumpulan objek ke kumpulan objek lainnya. Kamus bisa berubah; ini berarti mereka dapat diubah jika dan bila diperlukan berdasarkan persyaratan.
Bagaimana cara menerapkan kamus dengan Python?
Program berikut menunjukkan implementasi dasar kamus dengan Python mulai dari pembuatannya hingga implementasinya.
# Create a new dictionary
d = dict() # or d = {}
# Add a key - value pairs to dictionary
d['xyz'] = 123
d['abc'] = 345
# print the whole dictionary
print(d)
# print only the keys
print(d.keys())
# print only values
print(d.values())
# iterate over dictionary
for i in d :
print("%s %d" %(i, d[i]))
# another method of iteration
for index, value in enumerate(d):
print (index, value , d[value])
# check if key exist 23. Python Data Structure –print('xyz' in d)
# delete the key-value pair
del d['xyz']
# check again
print("xyz" in d)
Keluaran
Program di atas menghasilkan keluaran berikut -
Note −Ada kekurangan terkait dengan penerapan kamus dengan Python.
Kekurangan
Kamus tidak mendukung operasi sekuens dari tipe data sekuens seperti string, tupel, dan daftar. Ini termasuk dalam jenis pemetaan bawaan.
Struktur data Daftar adalah jenis data serbaguna dengan Python, yang dapat ditulis sebagai daftar nilai yang dipisahkan koma di antara tanda kurung siku.
Sintaksis
Berikut adalah sintaks dasar untuk struktur -
List_name = [ elements ];
Jika Anda amati, sintaksnya dideklarasikan seperti array dengan satu-satunya perbedaan yaitu list dapat menyertakan elemen dengan tipe data berbeda. Array menyertakan elemen dari tipe data yang sama. Daftar dapat berisi kombinasi string, bilangan bulat, dan objek. Daftar dapat digunakan untuk implementasi tumpukan dan antrian.
Daftar bisa berubah. Ini dapat diubah jika diperlukan.
Bagaimana cara menerapkan daftar?
Program berikut menunjukkan implementasi daftar -
my_list = ['p','r','o','b','e']
# Output: p
print(my_list[0])
# Output: o
print(my_list[2])
# Output: e
print(my_list[4])
# Error! Only integer can be used for indexing
# my_list[4.0]
# Nested List
n_list = ["Happy", [2,0,1,5]]
# Nested indexing
# Output: a
print(n_list[0][1])
# Output: 5
print(n_list[1][3])
Keluaran
Program di atas menghasilkan keluaran berikut -
Fungsi bawaan daftar Python adalah sebagai berikut -
Append()- Menambahkan elemen ke akhir daftar.
Extend()- Menambahkan elemen dari daftar ke daftar lain.
Insert()- Ini menyisipkan item ke indeks yang ditentukan.
Remove()- Ini menghapus elemen dari daftar yang ditentukan.
Reverse()- Ini membalikkan elemen dalam daftar.
sort() - Ini membantu untuk mengurutkan elemen dalam urutan kronologis.
Kumpulan dapat didefinisikan sebagai koleksi tidak berurutan yang dapat diulang, dapat berubah dan tidak ada penyertaan elemen duplikat di dalamnya. Dalam Python, kelas himpunan adalah notasi himpunan matematika. Keuntungan utama menggunakan set adalah menyertakan metode yang sangat dioptimalkan untuk memeriksa elemen tertentu.
Python menyertakan kategori terpisah yang disebut set beku. Set ini adalah objek tetap yang hanya mendukung metode dan operator yang memberikan hasil yang diperlukan.
Bagaimana cara mengimplementasikan set?
Program berikut membantu dalam implementasi set -
# Set in Python
# Creating two sets
set1 = set()
set2 = set()
# Adding elements to set1
for i in range(1, 6):
set1.add(i)
# Adding elements to set2
for i in range(3, 8):
set2.add(i)
print("Set1 = ", set1)
print("Set2 = ", set2)
print("\n")
# Union of set1 and set2
set3 = set1 | set2# set1.union(set2)
print("Union of Set1 & Set2: Set3 = ", set3)
# Intersection of set1 and set2
set4 = set1 & set2# set1.intersection(set2)
print("Intersection of Set1 & Set2: Set4 = ", set4)
print("\n")
# Checking relation between set3 and set4
if set3 > set4: # set3.issuperset(set4)
print("Set3 is superset of Set4")
elif set3 < set4: # set3.issubset(set4)
print("Set3 is subset of Set4")
else : # set3 == set4
print("Set3 is same as Set4")
# displaying relation between set4 and set3
if set4 < set3: # set4.issubset(set3)
print("Set4 is subset of Set3")
print("\n")
# difference between set3 and set4
set5 = set3 - set4
print("Elements in Set3 and not in Set4: Set5 = ", set5)
print("\n")
# checkv if set4 and set5 are disjoint sets
if set4.isdisjoint(set5):
print("Set4 and Set5 have nothing in common\n")
# Removing all the values of set5
set5.clear()
print("After applying clear on sets Set5: ")
print("Set5 = ", set5)
Keluaran
Program di atas menghasilkan keluaran berikut -
Set beku dapat didemonstrasikan menggunakan program berikut -
normal_set = set(["a", "b","c"])
# Adding an element to normal set is fine
normal_set.add("d")
print("Normal Set")
print(normal_set)
# A frozen set
frozen_set = frozenset(["e", "f", "g"])
print("Frozen Set")
print(frozen_set)
Keluaran
Program di atas menghasilkan keluaran berikut -
Antrian adalah kumpulan objek, yang mendefinisikan struktur data sederhana mengikuti prosedur FIFO (Fast In Fast Out) dan LIFO (Last In First Out). Operasi penyisipan dan penghapusan disebut sebagaienqueue dan dequeue operasi.
Antrian tidak mengizinkan akses acak ke objek yang dikandungnya.
Bagaimana cara menerapkan prosedur FIFO?
Program berikut membantu dalam penerapan FIFO -
import Queue
q = Queue.Queue()
#put items at the end of the queue
for x in range(4):
q.put("item-" + str(x))
#remove items from the head of the queue
while not q.empty():
print q.get()
Keluaran
Program di atas menghasilkan keluaran berikut -
Bagaimana cara menerapkan prosedur LIFO?
Program berikut membantu dalam implementasi prosedur LIFO -
import Queue
q = Queue.LifoQueue()
#add items at the head of the queue
for x in range(4):
q.put("item-" + str(x))
#remove items from the head of the queue
while not q.empty():
print q.get()
Keluaran
Program di atas menghasilkan keluaran berikut -
Apa itu Antrian Prioritas?
Antrian prioritas adalah struktur data kontainer yang mengelola sekumpulan record dengan kunci yang diurutkan untuk menyediakan akses cepat ke record dengan kunci terkecil atau terbesar dalam struktur data yang ditentukan.
Bagaimana cara menerapkan antrian prioritas?
Implementasi antrian prioritas adalah sebagai berikut -
import Queue
class Task(object):
def __init__(self, priority, name):
self.priority = priority
self.name = name
def __cmp__(self, other):
return cmp(self.priority, other.priority)
q = Queue.PriorityQueue()
q.put( Task(100, 'a not agent task') )
q.put( Task(5, 'a highly agent task') )
q.put( Task(10, 'an important task') )
while not q.empty():
cur_task = q.get()
print 'process task:', cur_task.name
Keluaran
Program di atas menghasilkan keluaran berikut -
Serialisasi string adalah proses menulis keadaan objek ke dalam aliran byte. Dalam python, pustaka "acar" digunakan untuk mengaktifkan serialisasi. Modul ini menyertakan algoritme yang kuat untuk membuat serial dan membatalkan serialisasi struktur objek Python. "Pengawetan" adalah proses mengubah hierarki objek Python menjadi aliran byte dan "membongkar" adalah prosedur sebaliknya.
Demonstrasi modul acar adalah sebagai berikut -
import pickle
#Here's an example dict
grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }
#Use dumps to convert the object to a serialized string
serial_grades = pickle.dumps( grades )
print(serial_grades)
#Use loads to de-serialize an object
received_grades = pickle.loads( serial_grades )
print(received_grades)
Keluaran
Program di atas menghasilkan keluaran berikut -
Konkurensi sering disalahartikan sebagai paralelisme. Concurrency menyiratkan penjadwalan kode independen untuk dieksekusi secara sistematis. Bab ini berfokus pada eksekusi konkurensi untuk sistem operasi menggunakan Python.
Program berikut membantu dalam pelaksanaan konkurensi untuk sistem operasi -
import os
import time
import threading
import multiprocessing
NUM_WORKERS = 4
def only_sleep():
print("PID: %s, Process Name: %s, Thread Name: %s" % (
os.getpid(),
multiprocessing.current_process().name,
threading.current_thread().name)
)
time.sleep(1)
def crunch_numbers():
print("PID: %s, Process Name: %s, Thread Name: %s" % (
os.getpid(),
multiprocessing.current_process().name,
threading.current_thread().name)
)
x = 0
while x < 10000000:
x += 1
for _ in range(NUM_WORKERS):
only_sleep()
end_time = time.time()
print("Serial time=", end_time - start_time)
# Run tasks using threads
start_time = time.time()
threads = [threading.Thread(target=only_sleep) for _ in range(NUM_WORKERS)]
[thread.start() for thread in threads]
[thread.join() for thread in threads]
end_time = time.time()
print("Threads time=", end_time - start_time)
# Run tasks using processes
start_time = time.time()
processes = [multiprocessing.Process(target=only_sleep()) for _ in range(NUM_WORKERS)]
[process.start() for process in processes]
[process.join() for process in processes]
end_time = time.time()
print("Parallel time=", end_time - start_time)
Keluaran
Program di atas menghasilkan keluaran berikut -
Penjelasan
"Multiprocessing" adalah paket yang mirip dengan modul threading. Paket ini mendukung konkurensi lokal dan jarak jauh. Karena modul ini, programmer mendapatkan keuntungan untuk menggunakan banyak proses pada sistem yang diberikan.
Anti-pola mengikuti strategi yang bertentangan dengan pola desain yang telah ditentukan sebelumnya. Strategi tersebut mencakup pendekatan umum untuk masalah umum, yang dapat diformalkan dan secara umum dapat dianggap sebagai praktik pembangunan yang baik. Biasanya, anti-pola berlawanan dan tidak diinginkan. Antipola adalah pola tertentu yang digunakan dalam pengembangan perangkat lunak, yang dianggap sebagai praktik pemrograman yang buruk.
Fitur penting anti pola
Sekarang mari kita lihat beberapa fitur penting dari anti-pola.
Ketepatan
Pola-pola ini benar-benar merusak kode Anda dan membuat Anda melakukan hal yang salah. Berikut adalah ilustrasi sederhana tentang ini -
class Rectangle(object):
def __init__(self, width, height):
self._width = width
self._height = height
r = Rectangle(5, 6)
# direct access of protected member
print("Width: {:d}".format(r._width))
Pemeliharaan
Suatu program dikatakan dapat dipelihara jika mudah dipahami dan dimodifikasi sesuai kebutuhan. Mengimpor modul dapat dianggap sebagai contoh pemeliharaan.
import math
x = math.ceil(y)
# or
import multiprocessing as mp
pool = mp.pool(8)
Contoh anti pola
Contoh berikut membantu dalam demonstrasi anti-pola -
#Bad
def filter_for_foo(l):
r = [e for e in l if e.find("foo") != -1]
if not check_some_critical_condition(r):
return None
return r
res = filter_for_foo(["bar","foo","faz"])
if res is not None:
#continue processing
pass
#Good
def filter_for_foo(l):
r = [e for e in l if e.find("foo") != -1]
if not check_some_critical_condition(r):
raise SomeException("critical condition unmet!")
return r
try:
res = filter_for_foo(["bar","foo","faz"])
#continue processing
except SomeException:
i = 0
while i < 10:
do_something()
#we forget to increment i
Penjelasan
Contohnya termasuk demonstrasi standar baik dan buruk untuk membuat fungsi dengan Python.
Penanganan pengecualian juga merupakan kriteria utama pola desain. Pengecualian adalah kesalahan yang terjadi selama eksekusi program. Saat kesalahan tertentu terjadi, penting untuk membuat pengecualian. Ini membantu dalam mengekang crash program.
Mengapa menggunakan pengecualian?
Pengecualian adalah cara mudah untuk menangani kesalahan dan kondisi khusus dalam sebuah program. Ketika seorang pengguna berpikir bahwa kode yang ditentukan dapat menghasilkan kesalahan maka penting untuk menggunakan penanganan pengecualian.
Contoh - Pembagian dengan nol
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except:
print("Oops!",sys.exc_info()[0],"occured.")
print("Next entry.")
print()
print("The reciprocal of",entry,"is",r)
Keluaran
Program di atas menghasilkan keluaran berikut -
Meningkatkan Pengecualian
Dalam pemrograman Python, pengecualian dimunculkan ketika kesalahan kode yang sesuai terjadi pada waktu proses. Ini dapat dinaikkan secara paksa menggunakan“raise” kata kunci.
Sintaksis
raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt