2014-12-01 11 views
8

हम जानते हैं कि अंकन के साथ:सशर्त बयान है, लेकिन समारोह के दायरे से बाहर

class Foo(object): 

    a = 1 

    def __init__(self): 
     self.b = 2 

    def c(self): 
     print('c') 

हम स्थिर चर Foo.a बना सकते हैं, 'सामान्य' चर b, जो बनाने और उदाहरण के बाद उपलब्ध होगा Foo, और विधि c

आज की मैं वास्तव में आश्चर्यचकित था, कि मैं एक कक्षा में सशर्त बयान का उपयोग कर सकते हैं, लेकिन बाहर समारोह के दायरे से

class C(): 
    if True: 
     a = 1 
    b = 2 

बोली सी ++/जावा, जैसे मुझे सिखाया है कि कानूनी अंकन के समान है: अन्य नियमों

class Name(): 
    variable = <expression> 

आप का वर्णन किया जा सका है, जो इस विशिष्ट दायरे को देखें? मुझे इस दायरे का नाम कैसे देना चाहिए?

उत्तर

11

कक्षा निकाय बस पायथन कोड है। इसमें विशिष्ट दायरे के नियम हैं, लेकिन कुछ भी अन्यथा जाता है। इसका मतलब है आप सशर्त कार्यों बना सकते हैं:

class C: 
    if some_condition: 
     def optional_method(self): 
      pass 

या कहीं और से तरीकों खींच:

import some_module 

class D: 
    method_name = some_module.function_that_accepts_self 

आदि

class definitions राज्यों के लिए

अजगर प्रलेखन:

एक वर्ग परिभाषा एक निष्पादन योग्य बयान है।

और

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

उस पाठ में आमतौर पर पर ध्यान दें। अनिवार्य रूप से, वर्ग निकाय को एक समारोह के रूप में निष्पादित किया जाता है, और जो भी आप शरीर के नामस्थान में डालते हैं वह वर्ग पर एक विशेषता बन जाता है।

*Naming and binding अनुभाग तो आपको बताता है:

एक वर्ग ब्लॉक में परिभाषित वर्ग ब्लॉक तक ही सीमित है नाम का दायरा; यह विधियों के कोड ब्लॉक

इसलिए इस ब्लॉक में परिभाषित नामों को सीधे तरीकों से एक्सेस नहीं किया जा सकता है; आप इसके बजाय class.name या self.name का उपयोग करेंगे।

1

जावा सब कुछ classes और object है, classes कंटेनर हैं, लेकिन अजगर हर चीज में object है। Classes भी objects हैं। functions(also objects) की तरह जब आप फ़ंक्शन में सशर्त कथन का उपयोग करते हैं तो पायथन आपको कक्षाओं में ऐसा करने की अनुमति देता है।

की तरह: -

def A(): 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

ही है

Class A() 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

आप कार्यों भी एक चर में संग्रहीत करने के लिए की तरह आप कक्षाएं

def A(): 
    pass 

a = A # is valid 

लिए क्या प्रदान कर सकते हैं, जबकि जावा में आप कर सकते हैं कक्षाओं के बाहर समारोह परिभाषित नहीं करते हैं।

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