পাইথনে "ক্লাস পদ্ধতি" এবং "উদাহরণ পদ্ধতি" কী?


37

একটি প্রশ্নের সাথে আড্ডায় একটি আলোচনা হয়েছে (প্রশ্নটি নিজেই এটির সাথে সম্পর্কিত নয়), এটি প্রকাশ করেছে যে আমি পাইথনকে যা কিছু জানি না।

আমার মনে, যদিও ভাষাগুলি ভাষাগুলিতে পৃথক পৃথক, আমরা সাধারণত ফাংশনগুলিকে শ্রেণিবদ্ধ করতে পারি:

  • [ফ্রি] ফাংশন
  • স্থিতিশীল পদ্ধতি / স্থির সদস্য ফাংশন
  • স্থিতিশীল পদ্ধতি / অ স্থিতিশীল সদস্য ফাংশন

স্পষ্টতই পাইথনে আরও একটি ধরণের ফাংশন রয়েছে যা উপরের বিভাগগুলিতে ফিট করে না, এটি একটি পদ্ধতি যা "তবে এটির শ্রেণিটি জানেন না"।

পাইথনে "ক্লাস পদ্ধতি" এবং "উদাহরণ পদ্ধতি" কী?


1
কেউ যদি চ্যাটের আলোচনায় আগ্রহী হন তবে এখানে শুরু করুন: chat.stackexchange.com/transcript/message/26479002#26479002
ইয়ানিস

1
আইএমওর আরও ভাল উত্তরটি একটি ভিন্ন স্ট্যাকেক্সচেঞ্জের ওয়েবসাইট দ্বারা সরবরাহ করা হয়েছে: স্ট্যাকওভারফ্লো.com
ট্রেভর বয়েড স্মিথ

এফওয়াইআই লিঙ্কটি স্বীকৃত নীচের অংশে সরবরাহ করা হয়েছে ... তবে আমি মনে করি অনেক লোক লিঙ্কটি মিস করবেন বা কখনই এটিতে পাবেন না এবং তাই আমি এখানে এটি অনুলিপি করেছি।
ট্রেভর বয়েড স্মিথ

উত্তর:


49

সংক্ষিপ্ত উত্তর

  • একটি উদাহরণ পদ্ধতি তার উদাহরণটি জানে (এবং এটি থেকে, তার শ্রেণি)
  • একটি বর্গ পদ্ধতি তার শ্রেণি জানে
  • একটি স্থিতিশীল পদ্ধতিটি তার শ্রেণি বা উদাহরণ জানে না

দীর্ঘ উত্তর

ক্লাস পদ্ধতি

একটি শ্রেণি পদ্ধতি এমন একটি যা সামগ্রিকভাবে শ্রেণীর অন্তর্ভুক্ত। এটির উদাহরণ প্রয়োজন হয় না। পরিবর্তে, ক্লাসটি স্বয়ংক্রিয়ভাবে প্রথম যুক্তি হিসাবে প্রেরণ করা হবে। @classmethodসাজসজ্জারের সাথে একটি শ্রেণি পদ্ধতি ঘোষণা করা হয় ।

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

class Foo(object):
    @classmethod
    def hello(cls):
        print("hello from %s" % cls.__name__)
Foo.hello()
-> "Hello from Foo"
Foo().hello()
-> "Hello from Foo"

তাত্ক্ষণিক পদ্ধতি

অন্যদিকে, উদাহরণস্বরূপ পদ্ধতিটি কল করার জন্য একটি উদাহরণ প্রয়োজন, এবং কোনও ডিকোরিটারের প্রয়োজন নেই। এটি এখন পর্যন্ত সবচেয়ে সাধারণ ধরণের পদ্ধতি।

class Foo(object):
    def hello(self):
        print("hello from %s" % self.__class__.__name__)
Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'self'

(দ্রষ্টব্য: উপরেরটি পাইথন 3 এর সাথে রয়েছে; পাইথন 2 দিয়ে আপনি কিছুটা আলাদা ত্রুটি পাবেন)

স্থির পদ্ধতি

একটি স্ট্যাটিক পদ্ধতি একটি শ্রেণিবিন্যাসের মতো, তবে স্বয়ংক্রিয় প্যারামিটার হিসাবে শ্রেণি অবজেক্টটি পাবেন না। এটি @staticmethodসাজসজ্জা ব্যবহার করে তৈরি করা হয় ।

class Foo(object):
    @staticmethod
    def hello(cls):
        print("hello from %s" % cls.__name__)

Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'cls'

ডকুমেন্টেশন লিঙ্ক

এখানে সম্পর্কিত পাইথন 3 ডকুমেন্ট্যাটনের লিঙ্কগুলি রয়েছে:

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

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

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

সম্পর্কিত প্রশ্নগুলি


4
@ লাইটনেসেসেসিন অরবিত: আমি মনে করি না স্থির পদ্ধতিগুলি সাধারণত অজগরগুলিতে প্রায়শই ব্যবহৃত হয়। আমার সিস্টেমটি এলোমেলো নমুনা হিসাবে ব্যবহার করে, যখন আমি ইনস্টল করা সমস্ত প্যাকেজগুলি অনুসন্ধান করি তখন সমস্ত পদ্ধতির প্রায় 1% হ'ল স্থির পদ্ধতি (যা প্রকৃতপক্ষে আমার প্রত্যাশার চেয়ে বেশি ছিল)।
ব্রায়ান ওকলে

1
"স্থিতিশীল পদ্ধতি" সাধারণত একটি কোড গন্ধ হয় এবং এটি যেমন গোগোল পাইথন স্টাইল গাইড দ্বারা নিরুৎসাহিত করা হয়।
9000

3
আমি মনে করি উত্তরটি সাবক্লাসের দিকে দৃষ্টি আকর্ষণ করলে উত্তরটি আরও ভাল হবে, যেখানে শ্রেণিবদ্ধরা কিছু উপযোগিতা পান।
উইনস্টন ইওয়ার্ট

1
@ ব্যবহারকারী 2357112: আমি কেবল সমস্ত দৃষ্টান্ত গণনা করেছি "^ def(", তারপরে সমস্ত দৃষ্টান্ত গণনা করেছি @staticmethod। খুব অবৈজ্ঞানিক, তবে সম্ভবত বলপার্কের মধ্যেই ছিল।
ব্রায়ান ওকলে

2
@ কাশ্যপ: টিএল; ডিআর প্রথম অনুচ্ছেদে প্রযোজ্য। আমি মনে করি এটি নীচের চেয়ে শীর্ষে আরও ভাল কাজ করে।
ব্রায়ান ওকলে 21

8

পাইথনে "ক্লাস পদ্ধতি" এবং "উদাহরণ পদ্ধতি" কী?

  • "মান্য পদ্ধতি" কোনও মানটি (বা কোন পার্শ্ব-প্রতিক্রিয়াটি করতে হবে) তা বের করার জন্য উদাহরণে থাকা তথ্য ব্যবহার করে। এগুলি খুব সাধারণ।

  • একটি "শ্রেণি পদ্ধতি" শ্রেণি সম্পর্কে তথ্য ব্যবহার করে (এবং সেই শ্রেণীর উদাহরণ নয়) এটি কী করে তা প্রভাবিত করতে (তারা সাধারণত বিকল্প কনস্ট্রাক্টর হিসাবে নতুন উদাহরণ তৈরি করতে ব্যবহৃত হয়, এবং এটি অবিশ্বাস্যভাবে সাধারণ হয় না)।

  • একটি "স্ট্যাটিক পদ্ধতি" শ্রেণি বা উদাহরণ সম্পর্কে কোনও তথ্য ব্যবহার করে না এটি কী করে তা গণনা করে। এটি সুবিধার জন্য সাধারণত ক্লাসে থাকে। (যেমন, এগুলি খুব সাধারণও নয়))

এক্স এর ফাংশন

গণিতের ক্লাসটি মনে রাখবেন, "y x এর ফাংশন f(x)?" কোডে এটি প্রয়োগ করুন:

y = function(x)

উপরোক্ত দ্বারা বোঝানো হচ্ছে যেহেতু xপরিবর্তন yহতে পারে, পরিবর্তিত হতে পারে x। আমরা যখন বলি "এর yকাজ x"

কি হবে yহতে যখন zহয় 1? 2? 'FooBarBaz'?

yএর কোনও ফাংশন নয় z, তাই zআমাদের functionখাঁটি ফাংশন ধরে ধরে ফাংশনের ফলাফলকে কিছু হতে পারে এবং প্রভাব ফেলতে পারে না । (যদি এটি zবৈশ্বিক পরিবর্তনশীল হিসাবে অ্যাক্সেস করে তবে এটি কোনও খাঁটি ফাংশন নয় - এটি কার্যকরী বিশুদ্ধতা দ্বারা বোঝানো হয়েছে))

নিম্নলিখিত বিবরণগুলি পড়ার সাথে সাথে উপরের বিষয়গুলি মনে রাখবেন:

তাত্ক্ষণিক পদ্ধতি

একটি দৃষ্টান্ত পদ্ধতি ফাংশন যে একটি ফাংশন এর একটি দৃষ্টান্ত । ফাংশনটি তার পক্ষে যুক্তি হিসাবে নিখুঁতভাবে উদাহরণটি গ্রহণ করে এবং ফাংশনটি আউটপুট নির্ধারণ করতে উদাহরণটি ব্যবহৃত হয়।

উদাহরণ পদ্ধতির অন্তর্নির্মিত উদাহরণ হ'ল স্ট্রাইয়ার:

>>> 'ABC'.lower()
'abc'

str.lower স্ট্রিংয়ের উদাহরণে ডাকা হয় এবং এটি কোন নতুন স্ট্রিংটি ফিরে আসবে তা নির্ধারণের জন্য উদাহরণটিতে থাকা তথ্য ব্যবহার করে।

শ্রেণি পদ্ধতি:

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

একটা ক্লাস পদ্ধতি একটি ফাংশন যে একটি ফাংশন এর বর্গ । এটি শ্রেণিটিকে এটির পক্ষে যুক্তি হিসাবে গ্রহণ করে।

একটি অন্তর্নির্মিত উদাহরণ হ'ল dict.fromkeys:

>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}

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

>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])

শ্রেণীর পদ্ধতিটি ক্লাস সম্পর্কে তথ্য ব্যবহার করে (এবং সেই শ্রেণীর উদাহরণ নয়) কী ধরণের ক্লাসটি ফিরে আসবে তা প্রভাবিত করতে।

স্থির পদ্ধতি

আপনি এমন একটি পদ্ধতি উল্লেখ করেছেন যা "এর শ্রেণিটি জানে না" - এটি পাইথনের একটি স্থির পদ্ধতি। এটি কেবল শ্রেণীর অবজেক্টের সুবিধার জন্য সংযুক্ত attached এটি অন্য মডিউলে optionচ্ছিকভাবে পৃথক ফাংশন হতে পারে তবে এর কল স্বাক্ষর একই হবে।

একটি স্থিতিশীল পদ্ধতি হ'ল শ্রেণি বা অবজেক্টের একটির কাজ।

স্ট্যাটিক পদ্ধতির অন্তর্নির্মিত উদাহরণটি পাইথন 3 এর স্ট্রিমার মার্কেট্রান্স।

>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}

বেশ কয়েকটি যুক্তি দেওয়া, এটি একটি অভিধান তৈরি করে যা এটির শ্রেণীর কোনও কাজ নয়।

এটি সুবিধাজনক কারণ strসর্বদা বিশ্বব্যাপী নেমস্পেসে উপলভ্য, তাই আপনি সহজেই এটি অনুবাদ ফাংশন দিয়ে ব্যবহার করতে পারেন:

>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'

পাইথন 2 এ, আপনাকে এটি stringমডিউল থেকে অ্যাক্সেস করতে হবে :

>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'str' has no attribute 'maketrans'
>>> import string
>>> 'abracadabra'.translate(string.maketrans('abc', 'bca'))
'bcrbabdbcrb'

উদাহরণ

class AClass(object):
    """In Python, a class may have several types of methods: 
    instance methods, class methods, and static methods
    """

    def an_instance_method(self, x, y, z=None):
        """this is a function of the instance of the object
        self is the object's instance
        """
        return self.a_class_method(x, y)

    @classmethod
    def a_class_method(cls, x, y, z=None):
        """this is a function of the class of the object
        cls is the object's class
        """
        return cls.a_static_method(x, y, z=z)

    @staticmethod
    def a_static_method(x, y, z=None):
        """this is neither a function of the instance or class to 
        which it is attached
        """
        return x, y, z

আসুন তাত্ক্ষণিকভাবে:

>>> instance = AClass()

এখন উদাহরণটি সমস্ত পদ্ধতিতে কল করতে পারে:

>>> instance.an_instance_method('x', 'y')
('x', 'y', None)
>>> instance.a_static_method('x', 'y')
('x', 'y', None)
>>> instance.a_class_method('x', 'y')
('x', 'y', None)

তবে ক্লাসটি সাধারণত উদাহরণ পদ্ধতিটি কল করার উদ্দেশ্যে নয়, যদিও এটি অন্যদের কল করার আশা করা হয়:

>>> AClass.a_class_method('x', 'y')
('x', 'y', None)
>>> AClass.a_static_method('x', 'y')
('x', 'y', None)
>>> AClass.an_instance_method('x', 'y')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an_instance_method() missing 1 required positional argument: 'y'

উদাহরণ পদ্ধতিটি কল করতে আপনাকে স্পষ্টভাবে উদাহরণটি পাস করতে হবে:

>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)

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

@ লাইটনেসেসেসিনআরবিট আমি প্রতিটি পয়েন্টে বিস্তারিত দিয়েছি
অ্যারন হল

ব্যক্তিগতভাবে, আমি যেভাবে সর্বদা এটির দিকে নজর দিয়েছি তা হ'ল উদাহরণ পদ্ধতিটি একটি নির্দিষ্ট উদাহরণের একটি ক্রিয়াকলাপ, শ্রেণিক পদ্ধতিটি এক ধরণের নির্মাতা (সুবিধার জন্য, MyClass(1,2,3)পরিবর্তে পছন্দ মতো কিছু নয় MyClass.get_special(1,2,3)), এবং ঠিক যেমন একটি স্থিতিশীল পদ্ধতি যে কোনওভাবেই একা দাঁড়িয়ে থাকতে পারে এমন একটি সাধারণ ক্রিয়াকলাপ।
Zizouz212

হ্যাঁ, শ্রেণীবদ্ধগুলি সাধারণত বিকল্প নির্মাণকারীদের জন্য ব্যবহৃত হয় (উপরে আমার ডিক্ট.ফ্র্যামকি উদাহরণগুলি দেখুন, পান্ডাসও দেখুন ata ডেটাফ্রেম উত্স কোড দেখুন), তবে এটি কোনও সংজ্ঞায়িত বৈশিষ্ট্য নয়। আমার মাঝে মাঝে কেবল কোনও পদ্ধতি থেকে ক্লাস স্তরে সঞ্চিত ডেটা অ্যাক্সেস করা দরকার, উদাহরণটি অ্যাক্সেস না করেই। যদি আপনি টাইপ (স্ব) বা (আরও খারাপ, স্ব। Class শ্রেণি__) কল করছেন এবং অন্যথায় কোনও উদাহরণ পদ্ধতিতে সরাসরি নিজেকে ব্যবহার করছেন না, এটি একটি ভাল লক্ষণ যে আপনি এটিকে শ্রেণীবদ্ধ হিসাবে বিবেচনা করা উচিত। শ্রেণিবদ্ধদের যেমন দৃষ্টান্তের প্রয়োজন হয় না, এটি তাদের একক করা সহজ করে তোলে।
অ্যারন হল

4
  • একটি "ইনস্ট্যান্স মেথড" হ'ল একটি পদ্ধতি যা ইনস্ট্যান্ট অবজেক্টটিকে তার প্রথম পরামিতি হিসাবে পাস করে, যা কনভেনশন দ্বারা ডাকা হয় self। এটি ডিফল্ট।

  • একটি "স্ট্যাটিক পদ্ধতি" প্রাথমিক selfপরামিতি ছাড়াই একটি পদ্ধতি । এটি @ স্ট্যাটিকমেডোথ ডেকোরেটর দিয়ে প্রয়োগ করা হয়েছে ।

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

সি / সি ++ / ইত্যাদি ক্ষেত্রে "স্ট্যাটিক পদ্ধতি" শব্দের সাধারণ ব্যবহার পাইথন "স্ট্যাটিক" এবং পাইথন "শ্রেণি" উভয় পদ্ধতির ক্ষেত্রেই প্রযোজ্য, কারণ এই ধরণের দুটি পদ্ধতিরই উদাহরণের উল্লেখ নেই। সি / সি ++ / ইত্যাদি ক্ষেত্রে, পদ্ধতিগুলি সাধারণত শ্রেণীর সমস্ত নন-ইনস্ট্যান্ট সদস্য / পদ্ধতিগুলির মধ্যে অন্তর্নিহিত অ্যাক্সেস পায়, সম্ভবত এই কারণেই কেবলমাত্র পাইথন / রুবি / ইত্যাদি ভাষায় এই পার্থক্য বিদ্যমান।


সি / সি ++ এ স্থিত পদ্ধতিতে শ্রেণীর অবজেক্টের সাথে কোনও রেফারেন্স পাওয়া যায়? নাকি ক্লাসের শুধু "সদস্য"? তারা কি ক্লাসের নতুন সদস্য তৈরি করতে পারে? :)
অ্যারন হল

3
অ্যারনহল সি / সি ++ এ, শ্রেণি অবজেক্টের মতো কোনও জিনিস নেই এবং স্থিতিশীল পদ্ধতিগুলি কল করার জন্য আপনার এটির কোনও রেফারেন্সের প্রয়োজন নেই। আপনি কেবল লিখুন Class::staticMethod()এবং এটিই (যতক্ষণ না আপনি এটি staticMethod()ব্যক্তিগত বা কোনও কিছু বলে ডাকতে নিষেধ হন )।
Ixrec
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.