2012-01-20 15 views
5

कॉल किए बिना ऑब्जेक्ट बनाएं मैटलैब में, मैं निम्नलिखित करके एक स्ट्रक्चर सरणी (स्ट्रक्चर) बना सकता हूं।क्लास

person.name = 'Mike'; 
person.age = 25; 
person.gender = 'male'; 

जिसमें व्यक्ति को संरचना बनाने से पहले परिभाषित नहीं किया गया है। जब मैं अजगर में यह करने के लिए प्रयास करते हैं, यह मुझे एक त्रुटि

name 'person' is not defined 

देता है वहाँ अजगर में यह कर की एक ऐसी ही रास्ता नहीं है? धन्यवाद

संपादित करें: पायथन के लिए नया होने के नाते, मैं अभी भी matlab में सोचता हूं। मेरी समस्या यह है कि मेरे पास एक ऐसा फ़ंक्शन है जो एकाधिक इनपुट (40 से अधिक) लेगा, इसलिए फ़ंक्शन (इनपुट 1, इनपुट 2, ..., इनपुट 40) होने के बजाय, मेरे पास केवल फ़ंक्शन (इनपुट) होगा जहां इनपुट इनपुट .1, इनपुट 2, .., इनपुट.40 शामिल हैं।

+1

मैटलैब का दृष्टिकोण बहुत कम समझ में आता है। आप पाइथन में ऐसा कुछ क्यों करना चाहते हैं? पाइथन भाषा नियमों के बाद पाइथन में चीजों को करने में क्या गलत है? पायथन पर एक अलग भाषा के नियम लगाने का प्रयास क्यों करें? –

+0

हाय एसएलओटी, नीचे की तरह की प्रतिक्रिया पर मेरी टिप्पणी देखें। – mikeP

+0

आप वास्तव में एक पाइथन शब्दकोश –

उत्तर

6

अजगर जादुई एक कंटेनर वस्तु जब नहीं बनाएगा आप इसे गुणों को असाइन करना प्रारंभ करते हैं, और यदि मैटलैब इसे अनुमति देता है, तो मैं matlab को बुरी तरह टूटा मानता हूं। इस पर विचार करें:

person.name = "Mike" 
persom.age = 25 
person.sex = "Male" 

अब हम दो वस्तुओं, person और persom, और person है age, नहीं है और कोई संकेत है कि यह हुआ था। बाद में आप person.age प्रिंट करने का प्रयास करते हैं, और कोई उम्मीद करेगा कि मैटलैब शिकायत करेगा ... वास्तविक गलती के बाद दो पृष्ठ।

एक कक्षा को स्वयं कंटेनर या नामस्थान के रूप में उपयोग किया जा सकता है। इसे तुरंत चालू करने की कोई आवश्यकता नहीं है, और यदि आप केवल गुणों का बंडल चाहते हैं तो यह आपको थोड़ा सा टाइपिंग बचाएगा।

class sex: 
    male = "M" 
    female = "F" 

class person: 
    name = "Mike" 
    age = 25 
    sex = sex.male 

पहुंच सकता है या इनमें से किसी भी संशोधित करने के लिए आप person.name उपयोग कर सकते हैं, आदि

N.B. मैंने sex के लिए कक्षा का उपयोग किया ताकि साथ ही ऐसा करने के लाभों में से एक को समझाया जा सके: यह डेटा मानों में स्थिरता प्रदान करता है (याद नहीं है कि आपने "एम" या "पुरुष" या "पुरुष" का उपयोग किया है या नहीं और टाइपो को पकड़ता है (यानी पायथन शिकायत करेगा sex.mlae के बारे में लेकिन स्ट्रिंग "mlae" के बारे में नहीं और यदि आप बाद में इसे "नर" के खिलाफ जांच रहे थे तो बाद में असफल हो जाएगा)।

बेशक, आप अभी भी इस प्रकार की कक्षा परिभाषा में गलत वर्तनी name, age, या sex का जोखिम चलाते हैं। तो आप क्या कर सकते हैं कक्षा को टेम्पलेट के रूप में उपयोग करें और इसे तुरंत चालू करें।

class Person: 
    def __init__(self, name, age=None, sex=None): 
     self.name, self.age, self.sex = name, age, sex 

अब जब आप कार्य करें:

person = Person("Mike", 25, sex.male) 

या यदि आप दस्तावेज़ के लिए क्या उन सभी मापदंडों हैं हैं:

person = Person("Mike", age=25, sex=sex.male) 

यह एक वस्तु के साथ समाप्त करने के लिए काफी असंभव है कि एक गलत वर्तनी विशेषता नाम है। यदि आप इसे गड़बड़ करते हैं, तो पाइथन आपको उस गलती पर एक त्रुटि संदेश देगा जिस पर आपने गलती की थी। इस तरह से ऐसा करने का सिर्फ एक कारण है।

+0

चाहते हैं आपका अंतिम सुझाव सबसे अच्छा है। दूसरे अंतिम के साथ, आप ऑर्डर को गड़बड़ कर सकते हैं उदा। 'व्यक्ति = व्यक्ति (" माइक ", sex.male, 25)' –

+0

धन्यवाद Kindall। आपकी व्याख्या स्पष्ट और बहुत उपयोगी है। मैं मानता हूं कि यह आमतौर पर matlab में एक त्रुटि आई है। अगर मैं थोड़ा सा वर्णन कर सकता हूं तो मैंने सवाल क्यों पूछा। पाइथन के लिए नया होने के नाते, मैं अभी भी matlab में सोचता हूं। मेरी समस्या यह है कि मेरे पास एक ऐसा फ़ंक्शन है जो एकाधिक इनपुट (40 से अधिक) लेगा, इसलिए फ़ंक्शन (इनपुट 1, इनपुट 2, ..., इनपुट 40) होने के बजाय, मेरे पास केवल फ़ंक्शन (इनपुट) होगा जहां इनपुट इनपुट .1, इनपुट 2, .., इनपुट.40 शामिल हैं। पाइथन में मेरा matlab-centric समाधान संभव नहीं हो सकता है और मुझे समाधान पर पुनर्विचार करना पड़ सकता है। धन्यवाद – mikeP

+0

आप सूची में प्रत्येक इनपुट जोड़ने और सूची के सूचकांक द्वारा प्रत्येक इनपुट मूल्य तक पहुंचने का प्रयास कर सकते हैं। ऑर्डर महत्वपूर्ण होगा, हालांकि, और यह ऊपर वाले लोगों के रूप में एक लचीला समाधान नहीं है। – Michael0x2a

3

आप शायद एक शब्दकोश (हैश, साहचर्य सरणी) हैं:

person = {'name': 'Mike', 'age': 25} 
7

अजगर में, person कुछ वर्ग का एक उदाहरण हो गया है; यह सिर्फ पतली हवा से बाहर नहीं हो सकता है।

तुम इतनी तरह कुछ अपने कोड के लिए इसी तरह प्राप्त कर सकते थे:

class Struct(object): pass 

person = Struct() 
person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

print(person.__dict__) 

यह प्रिंट:

{'gender': 'male', 'age': 25, 'name': 'Mike'} 
11

अजगर में आप एक मौजूदा वर्ग के लिए गतिशील रूप से सदस्यों को जोड़ सकते हैं, लेकिन यह नाम पता होना चाहिए कुछ वर्ग के प्रकार के होने के लिए। ऐसा करने के लिए आप एक खाली वर्ग बना सकते हैं:

class Empty: 
    pass  # empty statement otherwise the class declaration cannot succeed 

यह का एक उदाहरण के रूप में अपने चर का निर्माण

person = Empty() 

और फिर जोड़ने के दूसरी ओर आप चाहते हैं जो कुछ डेटा

person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

, अगर आपको अतिरिक्त सुविधाओं की आवश्यकता नहीं है तो "सामान्य" वर्ग प्रदान करता है और आप केवल कुछ डेटा को एक कुंजी => वैल्यू फैशन में स्टोर करना चाहते हैं, तो आप बस एक शब्दकोश का उपयोग कर सकते हैं।

person={} 
person['name']='Mike' 
person['age']=25 
person['gender']='male' 

(ध्यान दें कि, कम से कम अजगर 2.7 अप करने के लिए, यह ज्यादातर है, बस एक शैलीगत अंतर नहीं है कक्षाएं शब्दकोशों के मामले में नीचे लागू किया जाता है के बाद से)

0

जबकि मैं एनपीई या मैटियो को पसंदीदा विधि के रूप में अनुशंसा करता हूं, क्योंकि फ़ंक्शन पाइथन में प्रथम श्रेणी की वस्तुएं हैं, इसलिए उन्हें खाली कक्षा का अनुकरण करने के लिए भी उपयोग किया जा सकता है, लेकिन उन्हें एकाधिक ऑब्जेक्ट्स के रूप में तत्काल नहीं किया जा सकता है (इसलिए आपके पास केवल प्रति कार्य एक ऑब्जेक्ट उदाहरण)।

>>> def person():pass 
... 
>>> person.name = 'Mike' 
>>> person.name 
'Mike' 
>>> person 
<function person at 0x020CF2F0> 

यह अजीब है, इसलिए मैं इसका उपयोग करने की अनुशंसा नहीं करता, लेकिन यह दर्शाता है कि कार्य पाइथन में प्रथम श्रेणी की वस्तुएं हैं।

संबंधित मुद्दे