@ স্ট্যাটিকমোথডো বনাম মডিউল-স্তরের ফাংশন


21

এটি সম্পর্কে @staticmethodএবং না @classmethod! আমি জানি কিভাবে staticmethodকাজ করে। আমি যেটি জানতে চাই তা হ'ল @staticmethodবনামের মডিউল-স্তরের ফাংশনের যথাযথ ব্যবহারের ক্ষেত্রে ।

আমি এই প্রশ্নটি গুগল করে দিয়েছি এবং মনে হচ্ছে কিছু সাধারণ চুক্তি আছে যে মডিউল-স্তরের ফাংশনগুলি স্থির পদ্ধতির তুলনায় বেশি পছন্দ করা হয় কারণ এটি বেশি অজগর। স্ট্যাটিক পদ্ধতিতে তার শ্রেণীর সাথে আবদ্ধ হওয়ার সুবিধা রয়েছে, যা কেবলমাত্র সেই শ্রেণিটি ব্যবহার করলে তা বোধগম্য হতে পারে। যাইহোক, পাইথন কার্যকারিতা সাধারণত মডিউল দ্বারা শ্রেণীবদ্ধ না করে সংগঠিত হয়, তাই সাধারণত এটিকে মডিউল ফাংশন বানানোও বোধগম্য হয়।

স্থিতিশীল পদ্ধতিগুলিও সাবক্লাসগুলির দ্বারা ওভাররাইড করা যায়, এটি আপনি কীভাবে দেখেন তার উপর নির্ভর করে একটি সুবিধা বা অসুবিধা। যদিও, স্থিতিশীল পদ্ধতিগুলি সাধারণত "কার্যকরীভাবে খাঁটি" থাকে তাই এটি ওভাররাইড করা স্মার্ট নাও হতে পারে তবে এটি কখনও কখনও সুবিধাজনক হতে পারে (যদিও এটি "সুবিধাজনক, তবে এটি কখনও করবেন না" ধরণের একমাত্র বিষয় যা আপনাকে শিখিয়ে দিতে পারে)।

স্ট্যাটিকমেডুড বা মডিউল-স্তরের ফাংশনগুলি ব্যবহার করার জন্য কি কোনও সাধারণ নিয়ম-থাম্বস রয়েছে? তাদের কোন কংক্রিট সুবিধা বা অসুবিধাগুলি রয়েছে (যেমন ভবিষ্যতের বর্ধন, বাহ্যিক প্রসার, পাঠযোগ্যতা)? সম্ভব হলে কেসের উদাহরণও দিন।

উত্তর:


11

প্রযুক্তিগতভাবে একটি স্ট্যাটিক পদ্ধতি এবং একটি মডিউল ফাংশন বেশ একইভাবে আচরণ করে - উভয় ক্ষেত্রেই তারা মানক ফাংশনগুলির মতো কাজ করে, পার্থক্যটি যেখানে তারা স্থাপন করা হয়েছে সেই স্থানের নামস্থান being সুতরাং সিদ্ধান্তটি রক্ষণাবেক্ষণযোগ্যতা / পঠনযোগ্যতার আরও একটি।

এই মানদণ্ডগুলির কিছু বা সমস্ত পূরণ করা হয় তবে আমি সাধারণত স্থিতিশীল পদ্ধতি ব্যবহার করব:

  • ইতিমধ্যে সাধারণ পদ্ধতি সহ একটি বিদ্যমান বর্গ রয়েছে
  • ফাংশনটি ক্লাসের অবজেক্টগুলির সাথে সম্পর্কিত হয় তবে একটি নির্দিষ্ট উদাহরণ নয়
  • আপনি পদ্ধতিটি এমনভাবে কল করতে সক্ষম হতে চান যেন এটি একটি স্থিতিশীল পদ্ধতি, সম্ভবত আপনি ক্লায়েন্ট কোডটি ভঙ্গ না করে ভবিষ্যতে পদ্ধতিটিকে অ স্থির করতে চাইতে পারেন

0

একটি প্রোগ্রাম বাস্তবের এক টুকরো অনুকরণ। আপনি বাস্তবতাটি কীভাবে উপলব্ধি করেন তার উপর নির্ভর করে এটি।

একটি ফাংশন কিছু ক্রিয়াকলাপ উপস্থাপন করে। ক্রিয়াকলাপটি যত বেশি সাধারণ, তত বেশি ক্রিয়াকলাপের সাথে ক্রিয়াকলাপ অনুকরণ করার প্রবণতা। পদ্ধতিগুলি ক্লাসে আবদ্ধ। ক্রিয়াকলাপ যত বেশি ক্লাসের সাথে সুনির্দিষ্ট, ততই এটি কোনও পদ্ধতির দ্বারা সিমুলেটেড হওয়ার ঝোঁক।

ত্রিকোণমিতিক কার্যাদি সম্পর্কে চিন্তা করুন। বলুন, এটি sin()এতটাই সুপরিচিত যে আপনি জানেন এটি কোণগুলির সাথে ফিট করে। আপনি জানেন যে এটি ইনপুট হিসাবে একটি ফ্ল্যাট নম্বর চায় এবং ফ্লোটটি ফেরত দেয়। যাইহোক, কোনও শ্রেণীর দ্বারা উপস্থাপিত একটি কোণের ডেটাটাইপ .sin()থাকতে পারে এবং তর্ক ছাড়াই একটি সাধারণ পদ্ধতি হতে পারে যা কোণ অবজেক্টের সাথে কাজ করে এবং .sin(x)একক যুক্তি দিয়ে শ্রেণীর স্থির পদ্ধতি হতে পারে। আমি বাজি ধরতে পারি যে আরও লোকেরা মনে করে যে sin()একটি সরল কাজ করা ভাল। তারা বেশি অভ্যস্ত।

অন্য দৃষ্টিভঙ্গি : একটি মডিউল একটি শ্রেণীর উদাহরণের সাথে সাদৃশ্যযুক্ত। এটির নিজস্ব সদস্য ভেরিয়েবল এবং সদস্য ফাংশন রয়েছে। কিছু অর্থে, এটি একটি সিঙ্গলটন প্যাটার্ন প্রয়োগ করে। আপনি যখনই এটিকে অ্যাপ্লিকেশনটির অন্য মডিউল থেকে আমদানি করবেন আপনি ঠিক একই ভেরিয়েবল এবং ফাংশনগুলির অ্যাক্সেস পাবেন।


0

আমার একটি ফাংশন রয়েছে যা একটি অবজেক্টের গভীর ডেটা হায়ারার্কির একটি অংশকে আর্গুমেন্ট হিসাবে গ্রহণ করবে। পরিবর্তে ডেটা হায়ারার্কির সেই অংশটি পেতে প্রয়োজনীয় কয়েকটি যুক্তি পাস করা জটিল হয়ে উঠবে। সুতরাং স্ব বা ক্লসের উল্লেখের কোনও কারণ নেই। তবে কার্যকারিতা কেবলমাত্র একটি নির্দিষ্ট শ্রেণীর অবজেক্টের অংশে ব্যবহৃত হবে। সুতরাং এটি আমার কাছে একটি শ্রেণিবদ্ধ পদ্ধতি বলে মনে হচ্ছে।

আরও, আমি শ্রেণীর নাম আমদানি করতে পছন্দ করি ('মডিউল আমদানি ক্লাস থেকে' 'আমদানি মডিউল'-এর পরিবর্তে))। একটি স্ট্যাটিক পদ্ধতি হিসাবে ফাংশনটি অন্তর্ভুক্ত করার জন্য আমাকে পদ্ধতিটিতে অ্যাক্সেস দেয় যখন মডিউল স্তরের ফাংশন হিসাবে এটি লেখার জন্য আলাদা আমদানির প্রয়োজন হয়।


2
আমি যদি আপনি হতাম তবে আমি প্রথম ব্যক্তির উত্তর দেওয়া এড়াতে চাই। এটা বিভ্রান্তিকর. পরিবর্তে আপনার দ্বিতীয় ব্যক্তির কাছে প্রশ্নকারীকে লিখতে হবে।
অ্যারন হল

সম্ভবত। আমি একটি উদাহরণ ব্যবহারের কেস সরবরাহ করছিলাম, এটি প্রশ্নকারীর মনে যা ছিল তার সাথে মেলে বা নাও পারে।
ডিভিডি অ্যাভিনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.