আমার অভিজ্ঞতায় কিছু প্যাটার্নগুলি পাইথনে এখনও কার্যকর এবং আরও স্থির ভাষার চেয়ে সেটআপ করা আরও সহজ। কিছু প্যাটার্নস ওটিওএইচ-এর কেবলমাত্র সিঙ্গলটন প্যাটার্নের মতো প্রয়োজন হয় না, বা এমনকি তেজস্ক্রিয় হয় না। পরিবর্তে একটি মডিউল স্তরের ভেরিয়েবল বা ফাংশন ব্যবহার করুন। বা বর্গ প্যাটার্ন ব্যবহার করুন।
একটি ক্রিয়েশনাল প্যাটার্ন স্থাপন করার পরিবর্তে প্রায়শই যথেষ্ট যা যথেষ্ট পরিমাণে কল করে যা বস্তু তৈরি করে। এটি কোনও ফাংশন, কোনও __call__
পদ্ধতি বা এমনকি কোনও শ্রেণি সহ একটি বস্তু হতে পারে , যেহেতু new()
পাইথনে কোনও নেই , কেবল শ্রেণির নিজেই একটি আহবান:
def make_da_thing(maker, other, stuff):
da_thing = maker(other + 1, stuff + 2)
# ... do sth
return da_thing
def maker_func(x, y):
return x * y
class MakerClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
...
a = make_da_thing(maker_func, 5, 8)
b = make_da_thing(MakerClass, 6, 7)
রাজ্য এবং কৌশল প্যাটার্ন সি ++ এবং জাভা জাতীয় ভাষায় খুব অনুরূপ কাঠামো ভাগ করে। পাইথনে কম। কৌশল প্যাটার্ন কম বেশি একই থাকে তবে স্টেট প্যাটার্ন বেশিরভাগ ক্ষেত্রে অপ্রয়োজনীয় হয়ে যায়। স্ট্যাটিক ভাষায় স্টেট প্যাটার্ন রানটাইমের সময় শ্রেণীর পরিবর্তনের অনুকরণ করে। পাইথনে, আপনি এটি করতে পারেন: রানটাইমের সময় কোনও বস্তুর শ্রেণি পরিবর্তন করুন। আপনি যতক্ষণ না এটি নিয়ন্ত্রিত, এনক্যাপসুলেটেড উপায়ে করেন, আপনার ভাল হওয়া উচিত:
class On(object):
is_on = True
def switch(self):
self.__class__ = Off
class Off(object):
is_on = False
def switch(self):
self.__class__ = On
...
my_switch = On()
assert my_switch.is_on
my_switch.switch()
assert not my_switch.is_on
স্ট্যাটিক টাইপ প্রেরণের উপর নির্ভর করে এমন প্যাটার্নগুলি কাজ করবে না, বা বেশ আলাদাভাবে কাজ করবে। আপনাকে যতটা বয়লার প্লেট কোড লিখতে হবে না, যেমন ভিজিটর প্যাটার্ন: জাভা এবং সি ++ তে আপনাকে প্রতিটি দর্শনীয় শ্রেণিতে একটি গ্রহণযোগ্য পদ্ধতি লিখতে হবে, তবে পাইথনে আপনি এই কার্যকারিতাটি মেশিন ক্লাসের মাধ্যমে দর্শন করতে পারবেন, যেমন:
class Visitable(object):
def accept(self, visitor):
visit = getattr(visitor, 'visit' + self.__class__.__name__)
return visit(self)
...
class On(Visitable):
''' exactly like above '''
class Off(Visitable):
''' exactly like above '''
class SwitchStatePrinter(object): # Visitor
def visitOn(self, switch):
print 'the switch is on'
def visitOff(self, switch):
print 'the switch is off'
class SwitchAllOff(object): # Visitor
def visitOn(self, switch):
switch.switch()
def visitOff(self, switch):
pass
...
print_state = SwitchStatePrinter()
turn_em_off = SwitchAllOff()
for each in my_switches:
each.accept(print_state)
each.accept(turn_em_off)
স্ট্যাটিক ল্যাঙ্গুয়েজে কোনও প্যাটার্ন প্রয়োগের জন্য কল করা অনেকগুলি পরিস্থিতি পাইথনে তেমন করে না। উচ্চতর অর্ডার ফাংশন (ডেকোরেটর, ফাংশন কারখানা) বা মেটা ক্লাসের মতো অনেক জিনিসই অন্যান্য থেকনিউকের সাথে সমাধান করা যায়।