एक पैरामीटर के रूप में ऑब्जेक्ट के साथ वर्ग


114

मैं कुछ अजगर कोड को स्कैला कोड में अनुवाद करने की कोशिश कर रहा हूं। तो मैं पायथन में कुल नोब हूं।

लेकिन कुछ वर्गों के पास एक पैरामीटर के रूप में वस्तु क्यों है लेकिन कभी भी स्पष्ट रूप से इसका उपयोग नहीं करते हैं? पहली जगह में एक पैरामीटर के रूप में होने के कारण क्या है?

उदाहरण:

class Table(object)

आपके समय के लिए शुक्रिया।


1
संभव शैली
— JBernardo

जवाबों:


112

पाइथन 2 में यह Tableएक नई शैली की कक्षा घोषित की गई है ("क्लासिक" वर्ग के विपरीत)। Python3 में सभी कक्षाएं नई शैली की कक्षाएं हैं, इसलिए यह अब आवश्यक नहीं है।

नई शैली की कक्षाओं में कुछ विशेष गुण होते हैं जिनकी क्लासिक कक्षाओं में कमी होती है।

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

इसके अलावा, गुण और सुपर क्लासिक कक्षाओं के साथ काम नहीं करते हैं।

Python2 में सभी वर्गों को नई शैली की कक्षाएं बनाना एक अच्छा विचार है। (हालांकि पिछड़े-अनुकूलता के लिए मानक पुस्तकालय में बहुत सी कक्षाएं अभी भी क्लासिक कक्षाएं हैं।)

सामान्य तौर पर, इस तरह के एक बयान में

class Foo(Base1, Base2):

Fooको आधार वर्ग से विरासत में मिला वर्ग घोषित किया जा रहा है Base1और Base2।

objectअजगर में सभी वर्गों की माँ है। यह एक नई शैली की कक्षा है, इसलिए objectइससे विरासत में Tableएक नई शैली की कक्षा बनती है।


क्या आप मुझे उस स्रोत पर पुनर्निर्देशित कर सकते हैं जो Python3 में पैरामीटर के रूप में ऑब्जेक्ट का उल्लेख करना आवश्यक नहीं है? मैं इसे ढूंढ नहीं सकता। धन्यवाद
— बर्फ

1
StackOverflow ( यहाँ, उदाहरण के लिए ) पर कई बार इसका उल्लेख किया गया है , लेकिन मैं डॉक्स में इस बारे में सरल घोषणा नहीं कर पाया हूँ। यह ट्यूटोरियल में (object वर्ग आधारों की सूची से चूक से) अनुमानित रूप से दिखाया गया है ।
— unutbu

1
Python3 डॉक्स भी राज्य है कि एक "नई शैली वर्ग" "वर्गों के स्वाद के लिए पुराना नाम है अब सभी वर्ग वस्तुओं के लिए इस्तेमाल किया (मेरे जोर)"। और Python2 डॉक्स बताता है कि "नई शैली की क्लास" किसी भी वर्ग की है जिसे विरासत में मिली है object। दो बयानों ने एक साथ रखा है कि आपको objectPython3 में वर्ग आधारों की सूची में शामिल करने की आवश्यकता नहीं है क्योंकि Python3 में सभी वर्ग नए-नए वर्ग हैं।
— unutbu

21

Tableवर्ग एक वर्ग कहा जाता है प्रदान कर रहा है object। यह कोई तर्क नहीं है। जिस कारण से आप objectस्पष्ट रूप से विस्तार करना चाहते हैं वह कक्षा को एक नई शैली की कक्षा में बदल देता है। यदि आप स्पष्ट रूप से निर्दिष्ट नहीं करते हैं object, तो पायथन 3 तक, यह पुरानी शैली की कक्षा होने के लिए डिफ़ॉल्ट होगा। (पायथन 3 के बाद से, सभी कक्षाएं नई शैली की हैं, चाहे आप स्पष्ट रूप से विस्तारित हों objectया नहीं।)

नई शैली और पुरानी शैली की कक्षाओं के बारे में अधिक जानकारी के लिए, कृपया यह प्रश्न देखें ।


1
यह अधिक सरल और संक्षिप्त जवाब है। धन्यवाद।
— सबुनकु

3

बस ध्यान दें कि "नई-शैली" बनाम "पुरानी-शैली" वर्ग भेद पायथन 2.x के लिए विशिष्ट है; 3.x में, सभी कक्षाएं "नई-शैली" हैं।


2

क्लास टेबल और क्लास टेबल (ऑब्जेक्ट) पायथन के लिए अलग नहीं हैं।

यह एक पैरामीटर नहीं है, इसका वस्तु से विस्तार (जो कई अन्य भाषाओं की तरह बेस क्लास है)।

सभी का कहना है कि यह "वस्तु" में परिभाषित है जो कुछ भी विरासत में मिला है। यह डिफ़ॉल्ट व्यवहार है।


3
स्वचालित रूप से फैली कक्षाएं objectकेवल पायथन 3 में डिफ़ॉल्ट व्यवहार हैं। अजगर 2 में, एक क्लास फैली हुई वस्तु में ऐसे गुण होते हैं जो एक क्लास जो ऑब्जेक्ट का विस्तार नहीं करता है, वह नहीं होगा।
— लुईस एलिस

1

ऑब्जेक्ट पायथन में परिभाषित क्लास ऑब्जेक्ट का सबसे आधार प्रकार है। वस्तु के गुण नीचे देखे जा सकते हैं

** >>> दिर (वस्तु)

[ ' वर्ग ', ' delattr ', ' दस्तावेज़ ', ' प्रारूप ', ' getAttribute ', ' हैश ', ' init ', ' नया ', ' कम करने ', ' reduce_ex ', ' रेपर ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

तो सारणी (वस्तु) सिर्फ विरासत है।


0

1) कक्षा का नाम (वस्तु): 2) वर्ग का नाम: वे दोनों एक ही हैं, लेकिन लेखन के मामले में पहले से काफी बेहतर है, यह अन्य वर्गों को दूसरे से विरासत में मिलाते हुए बेहतर लगता है, यह सजातीय दिखता है।

कितना समान? तो, पायथन में हर वस्तु वस्तु के अंतर्गत आती है, इसका अर्थ है कि पायथन में हर वस्तु वस्तु की संपत्ति है, यदि वह लिखती है या नहीं, तो उसे समझ नहीं पाएगी। पहले हम स्पष्ट रूप से इसे दूसरे में बताते हैं कि हमने नहीं किया।


पायथन 2 में ऐसा नहीं है, विवरण के लिए स्वीकृत उत्तर देखें।
— नीममी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.