পাইথনের জেন বলে যে জিনিসগুলি করার একমাত্র উপায় থাকা উচিত- তবুও আমি কখন কোন পদ্ধতি ব্যবহার করতে পারি এবং কখন কোন পদ্ধতি ব্যবহার করব সে সম্পর্কে সিদ্ধান্ত নিতে সমস্যাটি দেখি।
আসুন একটি তুচ্ছ উদাহরণ ধরুন - একটি চেসবোর্ড অবজেক্ট। ধরা যাক বোর্ডে সমস্ত আইনী কিং পদক্ষেপ উপলব্ধ করার জন্য আমাদের কিছু উপায় প্রয়োজন। আমরা কি চেসবোর্ড.গেট_কিং_মোভস () বা get_king_moves (দাবাবোর্ড) লিখি?
এখানে কিছু সম্পর্কিত প্রশ্ন আমি দেখেছি:
- অজগর কেন 'যাদু পদ্ধতি' ব্যবহার করে?
- পাইথনের স্ট্রিংগুলির স্ট্রিং দৈর্ঘ্য পদ্ধতি না থাকার কোনও কারণ আছে?
আমি যে উত্তর পেয়েছি সেগুলি মূলত বেয়াদবি ছিল:
পাইথন কিছু কার্যকারিতার জন্য যেমন পদ্ধতিগুলি ব্যবহার করে (যেমন list.index ()) তবে অন্যগুলির জন্য ফাংশন (যেমন লেন (তালিকা))?
এর প্রধান কারণ ইতিহাস। ফাংশনগুলি সেই অপারেশনগুলির জন্য ব্যবহৃত হত যা একদল ধরণের জেনেরিক ছিল এবং যেগুলি এমন কোনও বস্তুর জন্য এমনকি কাজ করার উদ্দেশ্যে তৈরি করা হয়েছিল যাগুলির কোনও পদ্ধতি নেই (যেমন: টিপলস)। আপনি যখন পাইথনের কার্যকরী বৈশিষ্ট্যগুলি (মানচিত্র (), প্রয়োগ () এবং অন্যান্য) ব্যবহার করেন তখন এমন কোনও ফাংশন থাকা সহজেই অবজেক্টের একটি নিরাকার সংগ্রহের জন্য প্রয়োগ করা যেতে পারে।
আসলে, অন্তর্নির্মিত ফাংশন হিসাবে লেন (), সর্বাধিক (), মিনিট () প্রয়োগ করা আসলে প্রতিটি ধরণের পদ্ধতি হিসাবে প্রয়োগ করার চেয়ে কম কোড। কেউ স্বতন্ত্র কেসগুলি সম্পর্কে চুপচাপ করতে পারে তবে এটি পাইথনের একটি অংশ, এবং এখন এই ধরনের মৌলিক পরিবর্তনগুলি করতে খুব দেরি হয়েছে। প্রচুর কোড ভাঙ্গা এড়াতে ফাংশনগুলি থাকতে হবে।
আকর্ষণীয় হলেও, উপরোক্ত বিষয়গুলি কী কৌশল অবলম্বন করবে সে সম্পর্কে সত্যিকার অর্থে খুব বেশি কিছু বলা যায় না।
এটি অন্যতম কারণ - কাস্টম পদ্ধতির সাহায্যে বিকাশকারীরা getLength (), দৈর্ঘ্য (), getleth () বা যেকোনো একটি পৃথক পদ্ধতির নাম চয়ন করতে পারবেন। পাইথন কঠোর নামকরণ কার্যকর করে যাতে সাধারণ ফাংশন লেন () ব্যবহার করা যায়।
সামান্য আরও আকর্ষণীয়। আমার গ্রহণযোগ্যতা হ'ল ফাংশনগুলি এক অর্থে, ইন্টারফেসের পাইথোনিক সংস্করণ।
সর্বশেষে, নিজে গুডো থেকে :
ক্ষমতা / ইন্টারফেস সম্পর্কে কথা বলার ফলে আমাদের কিছু "দুর্বৃত্ত" বিশেষ পদ্ধতির নাম সম্পর্কে ভাবতে বাধ্য করে। ভাষা রেফারেন্সে এটি বলে, "একটি শ্রেণি নির্দিষ্ট নামগুলি পদ্ধতি নির্দিষ্ট করে নির্দিষ্ট সিনট্যাক্স (যেমন পাটিগণিত ক্রিয়াকলাপ বা সাবস্ক্রিপ্টিং এবং স্লাইসিং) দ্বারা অনুরোধ করা কিছু ক্রিয়াকলাপ বাস্তবায়ন করতে পারে।" তবে বিশেষ নামের মতো এই সমস্ত পদ্ধতি রয়েছে
__len__
বা__unicode__
যা সিন্ট্যাক্সের সমর্থন না করে অন্তর্নির্মিত ফাংশনগুলির সুবিধার জন্য সরবরাহ করা হয়েছিল বলে মনে হয়। সম্ভবত একটি ইন্টারফেস-ভিত্তিক পাইথনে, এই পদ্ধতিগুলি নিয়মিত-নামক পদ্ধতিগুলিতে একটি এবিসি-তে__len__
পরিণত হবে , যাতে এটি হয়ে যায়class container: ... def len(self): raise NotImplemented
যদিও এটি সম্পর্কে আরও কিছু চিন্তাভাবনা করা হচ্ছে, আমি দেখতে পাচ্ছি না যে সমস্ত সিনট্যাকটিক ক্রিয়াকলাপগুলি কেবলমাত্র একটি নির্দিষ্ট এবিসি-তে যথাযথভাবে সাধারণভাবে নামকরণের পদ্ধতিটি গ্রহণ করবে না। "
<
", উদাহরণস্বরূপ, সম্ভবত "object.lessthan
" (বা সম্ভবত "comparable.lessthan
") প্রার্থনা করবে । সুতরাং আর একটি সুবিধা হ'ল পাইথনকে এই ম্যাঙ্গেল-নামের বিজোড়তা থেকে দূরে রাখার ক্ষমতা যা আমার কাছে এইচসিআইয়ের উন্নতি বলে মনে হয় ।হুঁ। আমি নিশ্চিত নই যে আমি রাজি (চিত্র :-)।
"পাইথন যুক্তি" এর দুটি বিট রয়েছে যা আমি প্রথমে ব্যাখ্যা করতে চাই।
প্রথমত, আমি এইচসিআই কারণে (
def __len__()
অনেক পরে এসেছি ) x.len () এর চেয়ে বেশি লেন (এক্স) বেছে নিয়েছি । দুটি আন্তঃসংযোগযুক্ত কারণ রয়েছে, উভয়ই এইচসিআই:(ক) কিছু ক্রিয়াকলাপের জন্য, উপসর্গ শিরোনাম পোস্টফিক্সের চেয়ে ভাল পড়ে - উপসর্গ (এবং ইনফিক্স!) অপারেশনগুলির গণিতে একটি দীর্ঘ traditionতিহ্য রয়েছে যা স্বাক্ষরগুলি পছন্দ করে যেখানে ভিজ্যুয়ালগুলি কোনও সমস্যা সম্পর্কে গণিতবিদকে ভাবতে সহায়তা করে। সহজ, যা দিয়ে আমরা মত একটি সূত্র পুনর্লিখন তুলনা
x*(a+b)
মধ্যেx*a + x*b
একটি কাঁচা OO যেমন পণ্য স্বরলিপি ব্যবহার করে একই জিনিস করছেন জবরজঙ্গতা করতে।(খ) আমি যখন কোডটি পড়ি যখন জানায় যে
len(x)
আমি জানি যে এটি কোনও কিছুর দৈর্ঘ্যের জন্য জিজ্ঞাসা করছে। এটি আমাকে দুটি জিনিস বলে: ফলাফলটি একটি পূর্ণসংখ্যা এবং যুক্তিটি এক ধরণের ধারক। বিপরীতে, যখন আমি পড়িx.len()
, আমাকে ইতিমধ্যে জানতে হবে যেx
কোনও ধরণের কনটেইনার একটি ইন্টারফেস বাস্তবায়ন করে বা একটি শ্রেণীর সাথে উত্তরাধিকার সূত্রে প্রাপ্তlen()
। আমাদের মাঝে মাঝে যে বিভ্রান্তি রয়েছে সেটার সাক্ষ্য দিন যখন ম্যাপিং বাস্তবায়ন না করে এমন কোনও শ্রেণীর একটি পদ্ধতিget()
বাkeys()
পদ্ধতি থাকে বা কোনও ফাইল যা ফাইল নয় তার একটিwrite()
পদ্ধতি থাকে।একই কথা অন্যভাবে বলছি, আমি বিল্ট-ইন অপারেশন হিসাবে 'লেন' দেখছি । আমি এটি হারাতে ঘৃণা করব। আপনি এটি বোঝাতে চেয়েছিলেন বা না তা আমি নিশ্চিত করে বলতে পারি না, তবে 'ডিফ লেন (স্ব): ...' অবশ্যই মনে হচ্ছে আপনি এটিকে কোনও সাধারণ পদ্ধতিতে কমিয়ে আনতে চান। আমি দৃ strongly়ভাবে -1 এ।
পাইথন যুক্তির দ্বিতীয় বিটটি আমি ব্যাখ্যা করার প্রতিশ্রুতি দিয়েছিলাম যে কারণটি দেখার জন্য আমি বিশেষ পদ্ধতিগুলি বেছে নিয়েছি
__special__
এবং কেবলমাত্র নয়special
। আমি অপারেশন প্রচুর anticipating হয় যে শ্রেণীর ওভাররাইড করতে চাইতে পারেন, কিছু মান (যেমন__add__
অথবা__getitem__
), কিছু তাই মান না (যেমন জরান এর__reduce__
একটি দীর্ঘ সময়ের জন্য এ সব সি কোডে কোন সমর্থন ছিল)। আমি চাইনি যে এই বিশেষ ক্রিয়াকলাপগুলি সাধারণ পদ্ধতির নামগুলি ব্যবহার করুন, কারণ তখনকার প্রাক-বিদ্যমান ক্লাসগুলি বা সমস্ত বিশেষ পদ্ধতির জন্য একটি এনসাইক্লোপেডিক স্মৃতিবিহীন ব্যবহারকারীদের দ্বারা লেখা ক্লাসগুলি দুর্ঘটনাক্রমে সংজ্ঞা সংজ্ঞায়িত করতে দায়বদ্ধ হবে যার প্রয়োগটি তারা বোঝাতে চাইছিল না সম্ভবত বিপর্যয়কর পরিণতি সহ। ইভান ক্রিশিয়া তার বার্তায় এই আরও সংক্ষিপ্ততার ব্যাখ্যা দিয়েছিলেন, যা আমি এই সমস্ত লেখার পরে এসেছি।- - গুয়েডো ভ্যান রসম (হোম পেজ: http://www.python.org/~guido/ )
আমার এই বিষয়টি বুঝতে পারছি যে নির্দিষ্ট কিছু ক্ষেত্রে উপসর্গ চিহ্নটি আরও বেশি অর্থবোধ করে (অর্থাত্ ডাক.কুয়াক ভাষাগত দৃষ্টিকোণ থেকে কোয়াক (ডাক) এর চেয়ে বেশি বোঝায়।)
এই জাতীয় ক্ষেত্রে, আমার ধারণাটি কেবল গিডোর প্রথম পয়েন্টের ভিত্তিতে get_king_moves বাস্তবায়ন করা হবে। তবে এটি এখনও একই ধরণের এবং পপ পদ্ধতির সাথে স্ট্যাক এবং কাতার শ্রেণি বাস্তবায়নের বিষয়ে প্রচুর খোলামেলা প্রশ্ন ফেলেছে- সেগুলি কি ফাংশন বা পদ্ধতি হওয়া উচিত? (এখানে আমি ফাংশনগুলি অনুমান করব, কারণ আমি সত্যিই একটি পুশ-পপ ইন্টারফেসের সিগন্যাল করতে চাই)
টিএলডিআর: ফাংশন বনাম পদ্ধতিগুলি কখন ব্যবহার করা উচিত তা সিদ্ধান্ত নেওয়ার কৌশলটি কী ব্যাখ্যা করতে পারে?
X.frob
বাX.__frob__
মুক্ত-স্থিতি থাকা থেকে খুব বেশি পার্থক্য হয় নাfrob
।