পাইথনে স্থির পদ্ধতি ব্যবহারের সুবিধা কী?


90

কোডটি সহ পাইথনে আমি আনবাউন্ড পদ্ধতি ত্রুটিতে চলে এসেছি

import random

class Sample(object):
'''This class defines various methods related to the sample'''

    def drawSample(samplesize,List):
        sample=random.sample(List,samplesize)
        return sample

Choices=range(100)
print Sample.drawSample(5,Choices)

এখানে অনেক সহায়ক পোস্ট পড়ার পরে, আমি @staticmethodকোডটি কীভাবে কাজ করতে উপরে উপরে যুক্ত করতে পারি তা ভেবেছিলাম । আমি এক অজগর নবাগত। কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন কেউ স্থির পদ্ধতিগুলি সংজ্ঞায়িত করতে চায়? বা, সমস্ত পদ্ধতি স্থির পদ্ধতি হিসাবে সংজ্ঞায়িত হয় না কেন?


4
এটি একটি বিজোড় প্রশ্ন। স্থিতিশীল পদ্ধতি একটি নকশার প্রয়োজনীয়তা । এটি কোনও "সুবিধা" জিনিস নয়। আপনি এগুলি ব্যবহার করেন কারণ আপনার অবশ্যই। স্থির পদ্ধতি থাকতে এটি কোনও শ্রেণীর নকশার বৈশিষ্ট্য। আপনি কি জিজ্ঞাসা করছেন স্থির পদ্ধতিগুলি প্রথম স্থানে রয়েছে? আমি মনে করি যে প্রশ্নটি আপনার আরও জানা দরকার তা আরও স্পষ্টভাবে সংজ্ঞায়িত করতে পারে।
এস .লট

15
না, আমি তাদের জানতে চাইনি। আমি যা জানতে চেয়েছিলাম তা কেন এটি একটি "প্রয়োজনীয়তা", যা অন্যের দেওয়া উত্তর থেকে পরিষ্কার হয়ে গেছে। যখন আপনি অ-স্থিতিশীল পদ্ধতিগুলির চেয়ে এটি কখন সংজ্ঞায়িত করবেন। ধন্যবাদ
কৌতূহলী 2

4
@ এস.লোট: সাধারণ শ্রেণি পদ্ধতি ব্যবহারের বিপরীতে যখন কোনও স্ট্যাটিকমাথার কোনও প্রয়োজনীয়তা ব্যবহার করা হয় তখন? আমি যতদূর বলতে পারি, একটি শ্রেণি পদ্ধতি স্ট্যাটিকমেডোথর যা করতে পারে তা করতে পারে। এই পোস্টে অন্য কোথাও তালিকাভুক্ত হিসাবে স্ট্যাটিকমেডোথের "সুবিধাগুলি" রয়েছে তবে স্ট্যাটিক পদ্ধতিটি যে জায়গায় ব্যবহার করা যেতে পারে এমন কোনও শ্রেণি পদ্ধতি কেন ব্যবহার করা যায় না তার কোনও কারণ আমি দেখতে পাচ্ছি না, তাই এটি প্রয়োজনীয়তা তৈরি করে
ফেলেছে

উত্তর:


128

স্থিতিশীল পদ্ধতিগুলির সীমিত ব্যবহার রয়েছে, কারণ তাদের কোনও শ্রেণীর উদাহরণের বৈশিষ্ট্যগুলিতে অ্যাক্সেস নেই (যেমন নিয়মিত পদ্ধতিতে থাকে) এবং শ্রেণীর বৈশিষ্ট্যগুলিতে তাদের অ্যাক্সেস নেই (যেমন কোনও শ্রেণি পদ্ধতিতে রয়েছে) )।

সুতরাং তারা প্রতিদিন ব্যবহারের পদ্ধতিগুলির জন্য দরকারী নয়।

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

এগুলি শ্রেণীর বাইরে রাখা যেতে পারে, তবে শ্রেণীর ভিতরে তাদের গোষ্ঠীভুক্ত করার বিষয়টি বোঝাতে পারে যেখানে তারা কেবল সেখানে প্রযোজ্য।

আপনি মডিউলটির পরিবর্তে উদাহরণ বা ক্লাসের মাধ্যমেও পদ্ধতিটি উল্লেখ করতে পারেন, যা পদ্ধতিটি কীভাবে সম্পর্কিত তা পাঠককে বুঝতে সাহায্য করতে পারে।


8
@ কৌতূহলী 2 বর্ণ: প্রত্যেকটি নয় , তবে কয়েকটি পদ্ধতি স্থির পদ্ধতি হিসাবে কার্যকর useful একটি উদাহরণ Localeশ্রেণী সম্পর্কে চিন্তা করুন , যার উদাহরণগুলি লোকাল (দুহ) হবে। কোনও getAvailableLocales()পদ্ধতি যেমন এই শ্রেণীর স্থির পদ্ধতির একটি দুর্দান্ত উদাহরণ হতে পারে: এটি স্পষ্টতই লোকেল শ্রেণীর অন্তর্ভুক্ত, অন্যদিকে স্পষ্টভাবে কোনও নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত নয়।
MestreLion

... এবং এটি ক্লাসের পদ্ধতিও নয়, কারণ এটি ক্লাসের কোনও পদ্ধতি অ্যাক্সেসের প্রয়োজন নাও হতে পারে।
MestreLion

আউট একটি স্ট্যাটিক পদ্ধতি যা একজন সম্পাদক পয়েন্ট করতে পারেন , বর্গ বৈশিষ্ট্যাবলী অ্যাক্সেস স্পষ্টভাবে থেকে নেমে নেভিগেট করে class_name.attribute, শুধু না cls.attributeবা self.attribute। এটি "সর্বজনীন" বৈশিষ্ট্যের জন্য সত্য। কনভেনশন অনুসারে, আপনাকে এইভাবে কোনও আন্ডারস্কোর দিয়ে লুকানো বৈশিষ্ট্যগুলি বা দুটি আন্ডারস্কোর দিয়ে ছড়িয়ে থাকা নামগুলি অ্যাক্সেস করা উচিত নয়। এর অর্থ হ'ল উত্তরাধিকারের স্তরক্রমের স্থানগুলিতে বৈশিষ্ট্য স্থানান্তর করার সময় আপনার কোডটি আরও ভঙ্গুর হবে।
ওডথিংকিং

গাইডোর একটি উক্তি যা স্থিরবিধির (কখনই নয়) কখন ব্যবহার করবেন তা সিদ্ধান্ত নিতে সহায়তা করে: "স্ট্যাটিক পদ্ধতিগুলি কতটা সীমাবদ্ধ তা আমরা সকলেই জানি ((এগুলি মূলত একটি দুর্ঘটনা - পাইথন ২.২ দিন পরে যখন আমি নতুন স্টাইলের ক্লাস এবং বর্ণনাকারী আবিষ্কার করছিলাম) , আমি শ্রেণি পদ্ধতিগুলি বাস্তবায়িত করতে চাইছিলাম তবে প্রথমে আমি সেগুলি বুঝতে পারি নি এবং দুর্ঘটনাক্রমে প্রথমে স্থির পদ্ধতিগুলি প্রয়োগ করেছিলাম Then তারপরে সেগুলি সরাতে কেবল ক্লাসের পদ্ধতি সরবরাহ করতে খুব দেরি হয়েছিল ""
বরিস চুরজিন

189

বিস্তারিত ব্যাখ্যার জন্য এই নিবন্ধটি দেখুন ।

টিএল; ডিআর

1. এটি selfযুক্তির ব্যবহার বাদ দেয় ।

২. এটি মেমরির ব্যবহার হ্রাস করে কারণ পাইথনকে প্রতিটি বস্তুর তীব্র বাধা দেওয়ার জন্য একটি বাউন্ড-পদ্ধতি ইনস্ট্যান্ট করতে হয় না :

>>>RandomClass().regular_method is RandomClass().regular_method
False
>>>RandomClass().static_method is RandomClass().static_method
True
>>>RandomClass.static_method is RandomClass().static_method
True

৩. এটি কোড পঠনযোগ্যতার উন্নতি করে, এটি নির্দেশ করে যে পদ্ধতিটি বস্তুর নিজের অবস্থার উপর নির্ভর করে না।

৪. এটি পদ্ধতিটিকে ওভাররাইড করার অনুমতি দেয় যে পদ্ধতিটি যদি মডিউল-স্তরে (যেমন শ্রেণীর বাইরে) সংজ্ঞায়িত করা হত তবে একটি উপশ্লাচ সেই পদ্ধতিটিকে ওভাররাইড করতে সক্ষম হবে না।


4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। যে কোনও পরিস্থিতিতে স্থিতিশীল পদ্ধতি এবং শ্রেণি নিজেই একই বস্তু হ'ল একটি আসল সুবিধা হ'ল বিশেষত যখন আপনার প্রচুর দৃষ্টান্ত থাকে (উদাহরণস্বরূপ একটি পরিবর্তনীয় ডাটাবেস রেকর্ডের জন্য প্রতিটি উদাহরণ)।
Zhuoyun ওয়েই

+1 এবং @ ZhuoyunWei এর সাথে সম্মত হন। কেবলমাত্র উত্তর যা স্থির পদ্ধতিটি বর্গ পদ্ধতির তুলনায় মাঝে মাঝে পছন্দনীয় (কেননা 1 এবং 3 সত্যই একই কারণে) কয়েকটি কারণ ব্যাখ্যা করে।
অ্যালেক্স

4
"কেন স্থির পদ্ধতি" এর সেরা উত্তর, তবে মূল প্রশ্নটি "কেন সমস্ত পদ্ধতি স্থির হয় না?" জিজ্ঞাসা করেছিল। সংক্ষিপ্ত "উদাহরণ বৈশিষ্ট্যে অ্যাক্সেস নেই" এটিও কভার করবে।
এক্সু

আইএমওর একমাত্র আসল সুবিধা হ'ল আপনি এটিকে একটি সাবক্লাসে ওভাররাইড করতে পারেন, তবে এর কিছুটা অনুভূতিও রয়েছে যে আপনি ওও-প্রজ্ঞামত কিছু ভুল করছেন, কোন ব্যবহারের ক্ষেত্রে আপনি এটি করবেন?
বরিস চুরজিন

23

এটি আপনার আসল প্রশ্নের মূল বিষয় নয়, তবে যেহেতু আপনি বলেছেন যে আপনি একটি অজগর নবাগত সম্ভবত এটি সহায়ক হবে এবং অন্য কেউ একেবারে বেরিয়ে এসে স্পষ্ট করে বলেননি।

পদ্ধতিটিকে একটি স্থিতিশীল পদ্ধতি করে আমি কখনই উপরের কোডটি স্থির করতাম না। আমি হয় ক্লাস খালি এবং সবেমাত্র একটি ফাংশন লিখেছি:

def drawSample(samplesize,List):
    sample=random.sample(List,samplesize)
    return sample

Choices=range(100)
print drawSample(5,Choices)

আপনার যদি অনেকগুলি সম্পর্কিত ফাংশন থাকে তবে আপনি এগুলিকে একটি মডিউলে গ্রুপ করতে পারেন - অর্থাত্ সেগুলি সমস্ত একই ফাইলে রেখে দিন, sample.pyউদাহরণস্বরূপ; তারপর

import sample

Choices=range(100)
print sample.drawSample(5,Choices)

অথবা আমি __init__ক্লাসে একটি পদ্ধতি যুক্ত করে এমন একটি দৃষ্টান্ত তৈরি করতাম যাতে দরকারী পদ্ধতি ছিল:

class Sample(object):
'''This class defines various methods related to the sample'''

    def __init__(self, thelist):
        self.list = thelist

    def draw_sample(self, samplesize):
        sample=random.sample(self.list,samplesize)
        return sample

choices=Sample(range(100))
print choices.draw_sample(5)

(আমি পিইপি ৮ এর প্রস্তাবিত স্টাইলের সাথে মেলে ধরে উপরের উদাহরণে কেস কনভেনশনগুলিও পরিবর্তন করেছি)

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


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

4
+1: ওপি'র কিছু ভুল ধারণা সম্পর্কে এটি একটি দুর্দান্ত ব্যাখ্যা ছিল। এবং আপনি একথা বলার জন্য অত্যন্ত সৎ ছিলেন যে আপনি স্থিতিশীল পদ্ধতি সম্পর্কে তাঁর প্রশ্নের উত্তর আসলেই দিচ্ছিলেন না , বরং আপনি বরং আরও একটি ভাল সমাধান দিয়েছিলেন যে তার সমস্যাটির মোটেও ক্লাসের প্রয়োজন নেই।
MestreLion

22

কেন স্থির পদ্ধতিগুলি সংজ্ঞায়িত করতে চান ?

ধরুন আমরা একটি আছে classনামক Mathতারপর

কেউ কিছু বস্তুর তৈরি করতে চান হবে class Math
এবং তারপর ডাকা মত পদ্ধতি ceilএবং floorএবং fabsএটিতে।

সুতরাং আমরা তাদের তৈরি static

উদাহরণস্বরূপ করা

>> Math.floor(3.14)

তুলনায় অনেক ভাল

>> mymath = Math()
>> mymath.floor(3.14)

সুতরাং এগুলি কোনও উপায়ে কার্যকর। এগুলি ব্যবহার করার জন্য আপনার কোনও শ্রেণীর উদাহরণ তৈরি করার দরকার নেই।

সমস্ত পদ্ধতি স্থির পদ্ধতি হিসাবে সংজ্ঞায়িত হয় না কেন ?

তাদের উদাহরণ ভেরিয়েবল অ্যাক্সেস নেই।

class Foo(object):
    def __init__(self):
        self.bar = 'bar'

    def too(self):
        print self.bar

    @staticmethod
    def foo():
        print self.bar

Foo().too() # works
Foo.foo() # doesn't work

সে কারণেই আমরা সমস্ত পদ্ধতি স্থির করি না।


10
তবে কেন একটি প্যাকেজ গণিত হয় না? পাইথন এর জন্য প্যাকেজ রয়েছে, নেমস্পেস তৈরি করতে আপনার শ্রেণির সংজ্ঞা দরকার নেই
এক্সট্রাওন

6
@ এক্সট্রেনন: ইউপ ডুড আমি তা জানি তবে ব্যাখ্যাটির জন্য আমি কিছু সহজ এবং পরিচিত থাকতে চাই যাতে আমি এটি ব্যবহার করি Math। এজন্য আমি মূলধন করেছিলাম M
প্রতীক দেওঘরে

6
স্থির পদ্ধতি কী কী তা ওপি জিজ্ঞাসা করতে পারেনি। তিনি জিজ্ঞাসা করলেন তাদের লাভ কী? সেগুলি কীভাবে কার্যকর হবে তা নয় আপনি কীভাবে সেগুলি ব্যবহার করবেন তা আপনি ব্যাখ্যা করছেন। আপনার নির্দিষ্ট উদাহরণে, একটি নেমস্পেসটি আরও বেশি অর্থবোধ করবে।
জাভিয়ার

4
-1: ভাল এবং সঠিক ব্যাখ্যা, তবে খুব খারাপভাবে বেছে নেওয়া উদাহরণ: আপনার তৈরির কোনও কারণ নেই Mathপ্রথম স্থানে শ্রেণি হওয়ার জন্য, একটি মডিউলই আরও ভাল ফিট হতে পারে। কোনও শ্রেণীর উদাহরণ খুঁজে পাওয়ার চেষ্টা করুন যা শ্রেণি হিসাবে উপলব্ধি করে, "কেউই বস্তু তৈরি করতে চাইবে না " এমনটি নয় ।
MestreLion

4
এবং তারপরে ক্লাসের পদ্ধতিগুলির মধ্যে একটি (বা কিছু ) স্থিতিশীল হওয়ার জন্য বৈধ ব্যবহারের ক্ষেত্রে একটি উদাহরণ দিন , তবে সমস্ত নয় । যদি কোনও ক্লাসের সমস্ত পদ্ধতি স্থিতিশীল হয় তবে শ্রেণিটি একটি মডিউল হওয়া উচিত। যদি কোনওটি স্থির হয় না, তবে আপনি প্রশ্নের উত্তর দিচ্ছেন না।
MestreLion

13

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

আপনি যখন কোনও classmethodঅবজেক্টকে কোনও বস্তুকে (যা একটি ফাংশন অবজেক্টকে আবৃত করে) কল করেন, তত্ক্ষণিক বস্তুর শ্রেণি প্রথম আর্গুমেন্ট হিসাবে পাস হয়ে যায়।

আপনি যখন কোনও staticmethodঅবজেক্টকে কল করেন (যা কোনও ফাংশন অবজেক্টকে আবৃত করে), কোনও অন্তর্নিহিত প্রথম যুক্তি ব্যবহার করা হয় না।

class Foo(object):

    def bar(*args):
        print args

    @classmethod
    def baaz(*args):
        print args

    @staticmethod
    def quux(*args):
        print args

>>> foo = Foo()

>>> Foo.bar(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method bar() must be called with Foo instance as first argument (got int instance instead)
>>> Foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> Foo.quux(1,2,3)
(1, 2, 3)

>>> foo.bar(1,2,3)
(<Foo object at 0x1004a4510>, 1, 2, 3)
>>> foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> foo.quux(1,2,3)
(1, 2, 3)

4
+1: স্থিতিশীল পদ্ধতি এবং শ্রেণিক পদ্ধতিগুলি কী তা সম্পর্কে অবশেষে একটি দুর্দান্ত ব্যাখ্যা । যদিও ব্যাখ্যা করা হয়নি কেন কেউ কখনও একটি স্ট্যাটিক পদ্ধতি ব্যবহার করতে চান, অন্তত আপনি পরিষ্কারভাবে একটি সহজ উদাহরণে ব্যাখ্যা কি উভয় হয় অনেক সরকারী দস্তাবেজ করে বেশী ভালো।
MestreLion

3

স্ট্যাটিক পদ্ধতিগুলি দুর্দান্ত কারণ আপনার যে পদ্ধতিটির সাথে সম্পর্কিত সেটির কোনও উদাহরণ আপনাকে ঘোষণা করতে হবে না।

পাইথন এর সাইটের স্ট্যাটিক পদ্ধতি উপর কিছু মহান ডকুমেন্টেশন এখানে রয়েছে:
http://docs.python.org/library/functions.html#staticmethod


ধন্যবাদ ডেভিড তবে কেন তবে প্রতিটি পদ্ধতিকে স্থির পদ্ধতি হিসাবে সংজ্ঞায়িত করা হয় না, কারণ তারা উদাহরণগুলিতেও কাজ করে। এটি করার কোনও অসুবিধা আছে কি?
কৌতূহলী 2

4
@ কৌতূহলী 2 বর্ণ: না, স্থির পদ্ধতি সহ আপনার উদাহরণটিতে অ্যাক্সেস নেই: উদাহরণটি শ্রেণীর ব্যতীত উপেক্ষা করা হবে।
ফেলিক্স ক্লিং

4
সেই যুক্তি জাভাতে সত্য হবে, যেখানে ফাংশনগুলি নিজের দ্বারা বাঁচতে পারে না তবে সর্বদা শ্রেণীর প্রসঙ্গে সংজ্ঞায়িত হয়। তবে পাইথনে আপনার ফাংশন এবং স্ট্যাটিক ক্লাস ফাংশন থাকতে পারে। ক্লাসে নয় এমন পদ্ধতিতে স্থির পদ্ধতি কেন বেছে নেওয়া যায় তা এই উত্তরটি সত্যিই দেখায় না।
এক্সেরেনন

4
@ এক্সট্রেনন - এটি কোড সাংগঠনিক পছন্দসমূহের বেশি বিষয়; স্থিতিশীল পদ্ধতি থাকা একটিকে অতিরিক্ত বিকল্প দেয়।
চার্লস ডাফি

@ ফেলিক্স - ধন্যবাদ এটি স্পষ্ট করে যে কেন প্রতিটি পদ্ধতি স্থির পদ্ধতি নয়।
কৌতূহলী 2

3

একটি বিকল্প staticmethodআছে: classmethod, instancemethod, এবং function। এগুলি কী তা আপনি যদি না জানেন তবে শেষ বিভাগে স্ক্রোল করুন। যদি একটিstaticmethod এই বিকল্পগুলির যে কোনওটির চেয়ে ভাল হয় তবে এটি কী উদ্দেশ্যে রচিত তা নির্ভর করে।

পাইথন স্ট্যাটিক পদ্ধতির সুবিধা

  • আপনি বৈশিষ্ট্যাবলী বা বর্গ বা উদাহরণস্বরূপ পদ্ধতি এক্সেস প্রয়োজন হবে না থাকে, তাহলে একটি staticmethodএকটি বেশী ভালো classmethodবা instancemethod। এইভাবে এটি স্পষ্ট করে ( @staticmethodসাজসজ্জার থেকে ) শ্রেণি 'এবং উদাহরণস্বরূপের রাজ্যটি পড়া বা সংশোধিত নয়। তবে, ব্যবহার করেfunction এটি তফাতকে আরও স্পষ্ট তোলে (অসুবিধাগুলি দেখুন)।
  • একটি কল স্বাক্ষর staticmethodএকটি যে একই হয় classmethodবা instancemethod, যথা <instance>.<method>(<arguments>)। অতএব এটি যদি পরে বা কোনও উত্পন্ন ক্লাসে প্রয়োজন হয় তবে এটি সহজেই তিনটির মধ্যে একটি দ্বারা প্রতিস্থাপন করা যেতে পারে । আপনি একটি সহজ সঙ্গে এটি করতে পারবেন নাfunction
  • একটি staticmethodএকটি পরিবর্তে ব্যবহার করা যেতে পারে functionস্পষ্ট করতে যে এটা subjectively একটি বর্গ জন্যে এবং নামস্থান দ্বন্দ্ব প্রতিরোধ।

পাইথন স্ট্যাটিক পদ্ধতির অসুবিধা

  • এটি উদাহরণ বা শ্রেণীর বৈশিষ্ট্য বা পদ্ধতি অ্যাক্সেস করতে পারে না।
  • একটি কল স্বাক্ষর staticmethodএকটি যে একই হয় classmethodবা instancemethod। এটি staticmethodসত্যিকার অর্থে কোনও বস্তুর তথ্য পড়তে বা সংশোধন করে না mas এটি কোড পড়তে শক্ত করে তোলে। কেন শুধু একটি ব্যবহার করবেন না function?
  • একজন staticmethodযদি কখনও এটা বর্গ / উদাহরণস্বরূপ যেখানে এটি সংজ্ঞায়িত করা হয় বাইরে থেকে ফোন করতে হবে পুনরায় ব্যবহার করা কঠিন। পুনরায় ব্যবহারের কোনও সম্ভাবনা থাকলে কfunction থাকে তবে ভাল পছন্দ।
  • staticmethodকদাপি ব্যবহার করা হয়, যাতে লোকেরা কোড এক সামান্য বেশি সময় লাগতে পারে এটা পড়তে অন্তর্ভুক্ত পড়া চালিয়ে যান।

পাইথনের স্থির পদ্ধতির বিকল্প

এর সুবিধাগুলি নিয়ে আলোচনা করার জন্য staticmethod, আমাদের বিকল্পগুলি কী এবং কীভাবে তারা একে অপরের থেকে পৃথক রয়েছে তা জানতে হবে।

  • staticmethodএকটি বর্গ জন্যে কিন্তু অ্যাক্সেস বা কোনো দৃষ্টান্ত বা ক্লাসের তথ্য সংশোধন করতে পারবেন না।

এর তিনটি বিকল্প রয়েছে:

  • classmethodআহ্বানকারী এর ক্লাসে অ্যাক্সেস আছে।
  • instancemethodআহ্বানকারী দৃষ্টান্ত এবং তার ক্লাসে অ্যাক্সেস আছে।
  • functionক্লাস সঙ্গে কিছুই করার আছে। এটি সক্ষমতা সবচেয়ে নিকটতম staticmethod

কোডে এটি কেমন দেখাচ্ছে তা এখানে:

# function
# has nothing to do with a class
def make_cat_noise(asker_name):
    print('Hi %s, mieets mieets!' % asker_name)

# Yey, we can make cat noises before we've even defined what a cat is!
make_cat_noise('JOey')  # just a function

class Cat:
    number_of_legs = 4

    # special instance method __init__
    def __init__(self, name):
        self.name = name

    # instancemethod
    # the instance (e.g. Cat('Kitty')) is passed as the first method argument
    def tell_me_about_this_animal(self, asker_name):
        print('Hi %s, This cat has %d legs and is called %s'
              % (asker_name, self.number_of_legs, self.name))

    # classmethod
    # the class (e.g. Cat) is passed as the first method argument
    # by convention we call that argument cls
    @classmethod
    def tell_me_about_cats(cls, asker_name):
        print("Hi %s, cats have %d legs."
              % (asker_name, cls.number_of_legs))
        # cls.name  # AttributeError because only the instance has .name
        # self.name  # NameError because self isn't defined in this namespace

    # staticmethod
    # no information about the class or the instance is passed to the method
    @staticmethod
    def make_noise(asker_name):
        print('Hi %s, meooow!' % asker_name)
        # class and instance are not accessible from here

# one more time for fun!
make_cat_noise('JOey')  # just a function

# We just need the class to call a classmethod or staticmethod:
Cat.make_noise('JOey')  # staticmethod
Cat.tell_me_about_cats('JOey')  # classmethod
# Cat.tell_me_about_this_animal('JOey')  # instancemethod -> TypeError

# With an instance we can use instancemethod, classmethod or staticmethod
mycat = Cat('Kitty')  # mycat is an instance of the class Cat
mycat.make_noise('JOey')  # staticmethod
mycat.tell_me_about_cats('JOey')  # classmethod
mycat.tell_me_about_this_animal('JOey')  # instancemethod

1

কারণ নেমস্পেসিং ফাংশনগুলি দুর্দান্ত (যেমন আগে উল্লেখ করা হয়েছিল):

  1. যখন আমি এমন পদ্ধতির বিষয়ে স্পষ্ট হতে চাই যখন অবজেক্টের স্থিতি পরিবর্তন হয় না, আমি স্থিতিশীল পদ্ধতি ব্যবহার করি। এটি আমার টিমের লোকগুলিকে সেই পদ্ধতিগুলিতে অবজেক্টের বৈশিষ্ট্যগুলি পরিবর্তন করতে নিরুৎসাহিত করে।

  2. আমি যখন সত্যিকারের পচা কোডটি রিফ্যাক্ট করি, তখন @staticmethodযথাসম্ভব অনেকগুলি পদ্ধতি তৈরি করার চেষ্টা করে শুরু করি । এটি তখন আমাকে ক্লাসে এই পদ্ধতিগুলি নিষ্কাশনের অনুমতি দেয় - যদিও আমি সম্মতি জানাই, এটি খুব কমই আমি ব্যবহার করি এমন কিছু বিষয়, এটি কয়েকবার সহায়ক হয়েছিল।


1

আমার অনুমান অনুসারে, কেবলমাত্র বাইরে ফাংশনটি সংজ্ঞায়িত করার এবং শ্রেণি থেকে পৃথক করার তুলনায় এর ব্যবহারের কোনও একক কর্মক্ষমতা সুবিধা নেই @staticmethodএটি অন্যথায় হতে পারে @staticmethod

কেবলমাত্র আমি তাদের অস্তিত্বের ন্যায্যতা বলতে পারি সুবিধা convenience অন্যান্য জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজে স্ট্যাটিক পদ্ধতিগুলি সাধারণ, তাই অজগর নয় কেন? আপনি যদি এমন আচরণের সাথে এমন কোনও ক্রিয়াকলাপ তৈরি করতে চান যা আপনি যে শ্রেণীর জন্য এটি তৈরি করছেন তার সাথে খুব ঘনিষ্ঠভাবে জড়িত তবে এটি শ্রেণীর কোনও অভ্যন্তরের অভ্যন্তরীণ ডেটাটিকে এমনভাবে অ্যাক্সেস / সংশোধন করতে পারে না যা একে আদর্শ হিসাবে ধারণা করার ন্যায্যতা প্রমাণ করে তারপরে এই শ্রেণীর পদ্ধতিটি তার @staticmethodউপরে একটি চড় মারে এবং যে কেউ আপনার কোড পড়ে তাৎক্ষণিকভাবে পদ্ধতিটির প্রকৃতি এবং শ্রেণীর সাথে এর সম্পর্ক সম্পর্কে অনেক কিছু শিখতে পারে।

আমি মাঝে মধ্যে যা করতে চাই তা হল কার্যকারিতা স্থাপন করা যা আমার ক্লাসটি অভ্যন্তরীণভাবে প্রাইভেট @staticmethodএসগুলিতে প্রচুর ব্যবহার করে । এইভাবে আমি আমার মডিউলটি যে পদ্ধতিগুলিতে আমার মডিউলটি ব্যবহার করে তা আর কখনও ব্যবহারের জন্য দেখার প্রয়োজন হবে না এমনগুলি দিয়ে আমার মডিউল দ্বারা উদ্ঘাটন হওয়া এপিআইকে খণ্ডিত করতে হবে না।


0

স্থির পদ্ধতির পাইথনে প্রায় কোনও কারণ হওয়ার কারণ নেই। আপনি উদাহরণ পদ্ধতি বা শ্রেণীর পদ্ধতিগুলি ব্যবহার করেন।

def method(self, args):
    self.member = something

@classmethod
def method(cls, args):
    cls.member = something

@staticmethod
def method(args):
    MyClass.member = something
    # The above isn't really working
    # if you have a subclass

আপনি "প্রায়" বলেছিলেন। এমন কোনও জায়গা আছে যেখানে তারা বিকল্পগুলির চেয়ে ভাল হতে পারে?
জাভিয়ার

@ জাভিয়ার: আমি একটির কথা ভাবতে পারি না, তবে সম্ভবত একটি আছে, অন্যথায় পাইথন লাইব্রেরিতে কেন এই পদ্ধতিটি অন্তর্ভুক্ত করা হবে?
জর্জি স্কলি

4
@ জাভিয়ার, @ জর্জি: আপনার প্রচণ্ড বিশ্বাস আছে যে পাইথন কর্পাসের ক্রাফট নেই।
চার্লস মেরিয়াম

-১: এই উত্তরটি কোনও ব্যবহারের ক্ষেত্রে staticmethodবা কোনটি কী বা কেন হয় এবং এটি স্থিতিশীলগুলির চেয়ে "ভাল" এর কোনও ব্যাখ্যা উপস্থাপন করে না classmethod
MestreLion

@ চারলেস মেরিয়াম: অবশ্যই স্থির পদ্ধতিগুলির ব্যবহার রয়েছে, অন্যথায় এটি পাইথন 3 (যেখানে বেশিরভাগ উত্তরাধিকারী ক্রাফ্ট সরানো হয়েছিল) এ ফেলে দেওয়া বা অবমানন করা হত। একটা নয় একক বিরুদ্ধে শব্দ staticmethodমধ্যে ডক্স আপনার দাবির সমর্থন করার জন্য এটি cruft, বা যে গেয়র্গ এর দাবি classmethodপরিবর্তে ব্যবহার করা উচিত)।
ম্যাস্ট্রিলিয়ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.