पायथन में "क्लास मेथड्स" और "इंस्टेंस मेथड्स" क्या हैं?
एक "इंस्टेंस विधि" उदाहरण में निहित जानकारी का उपयोग करके यह पता लगाने के लिए करती है कि किस मूल्य को वापस करना है (या जो साइड-इफ़ेक्ट करना है)। ये बहुत आम हैं।
एक "क्लास मेथड" वर्ग के बारे में जानकारी का उपयोग करता है (और उस वर्ग का उदाहरण नहीं) यह प्रभावित करता है कि वे क्या करते हैं (वे आमतौर पर वैकल्पिक निर्माणकर्ताओं के रूप में नए उदाहरण बनाने के लिए उपयोग किए जाते हैं, और इस तरह अविश्वसनीय रूप से सामान्य नहीं हैं)।
एक "स्थिर विधि" वर्ग या उदाहरण के बारे में किसी भी जानकारी का उपयोग नहीं करता है कि वह क्या करता है। यह आमतौर पर सुविधा के लिए सिर्फ कक्षा में होता है। (जैसे, ये बहुत आम नहीं हैं।)
एक्स का एक समारोह
गणित वर्ग याद रखें, "y x का एक कार्य है f(x)
?" कि कोड में लागू करते हैं:
y = function(x)
ऊपर से आरोपित यह है कि जब से x
परिवर्तन हो सकता है, y
तब बदल सकता है x
। यह तब है जब हम कहते हैं कि " y
का एक कार्य है x
"
क्या होगा y
हो जब z
है 1
? 2
? 'FooBarBaz'
?
y
एक फ़ंक्शन नहीं है z
, इसलिए z
कुछ भी हो सकता है और फ़ंक्शन के परिणाम को प्रभावित नहीं करता है मान लें कि हमारा function
शुद्ध कार्य है। (यदि यह z
एक वैश्विक चर के रूप में पहुंचता है , तो यह एक शुद्ध कार्य नहीं है - यह वही है जो कार्यात्मक शुद्धता से है।)
उपरोक्त विवरणों को पढ़ते हुए उपरोक्त बातों को ध्यान में रखें:
उदाहरण के तरीके
एक उदाहरण विधि समारोह है कि है एक समारोह का एक उदाहरण । फ़ंक्शन उदाहरण को एक तर्क के रूप में स्वीकार करता है, और फ़ंक्शन के आउटपुट को निर्धारित करने के लिए फ़ंक्शन द्वारा आवृत्ति का उपयोग किया जाता है।
एक उदाहरण विधि का एक अंतर्निहित उदाहरण str.lower है:
>>> '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)])
कक्षा पद्धति किस प्रकार की कक्षा (और उस कक्षा का उदाहरण नहीं) के बारे में जानकारी का उपयोग करती है ताकि किस प्रकार के वर्ग को वापस लौटाया जा सके।
स्थैतिक तरीके
आप एक विधि का उल्लेख करते हैं, जो "अपनी कक्षा को नहीं जानता" - यह पायथन में एक स्थिर विधि है। यह केवल क्लास ऑब्जेक्ट के लिए सुविधा के लिए संलग्न है। यह वैकल्पिक रूप से किसी अन्य मॉड्यूल में एक अलग फ़ंक्शन हो सकता है, लेकिन इसका कॉल सिग्नेचर समान होगा।
एक स्थिर विधि न तो वर्ग और न ही वस्तु का एक कार्य है।
एक स्थिर विधि का एक अंतर्निहित उदाहरण पायथन 3 से str.maketrans है।
>>> 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)