2010-08-13 3 views
10

में स्टेटिक वैरिएबल विरासत मैं प्रोजेक्ट के लिए ब्लेंडर के लिए पाइथन स्क्रिप्ट लिख रहा हूं, लेकिन मैं भाषा के लिए काफी नया हूं। कुछ मैं उलझन में हूं स्थिर स्थिरता का उपयोग है। यहाँ कोड का टुकड़ा मैं वर्तमान पर काम कर रहा हूँ है:पायथन

class panelToggle(bpy.types.Operator): 
    active = False 

    def invoke(self, context, event): 
     self.active = not self.active 
     return{'FINISHED'} 

class OBJECT_OT_openConstraintPanel(panelToggle): 
    bl_label = "openConstraintPanel" 
    bl_idname = "openConstraintPanel" 

विचार यह है कि द्वितीय श्रेणी सक्रिय चर के वारिस चाहिए और , पहले से विधि आह्वान तो OBJECT_OT_openConstraintPanel.invoke बुला कि () OBJECT_OT_openConstraintPanel.active बदलता है। स्वयं का उपयोग करते हुए मैंने उपरोक्त काम नहीं किया है, और न ही पैनल टॉगल का उपयोग कर रहा है। इस बारे में कोई विचार है कि मैं इसके बारे में कैसे जाता हूं?

if panelToggle.active: 
    # do something 

आप एक विधि से वर्ग चर उपयोग करना चाहते हैं, तो आप लिख सकते हैं::

def am_i_active(self): 
    """ This method will access the right *class* variable by 
     looking at its own class type first. 
    """ 
    if self.__class__.active: 
     print 'Yes, sir!' 
    else: 
     print 'Nope.' 

एक काम कर उदाहरण

+0

ठीक है, ऐसा लगता है मैं उपयोग कर सकते हैं self.__class__.active या प्रकार (स्वयं) विधि ठीक से विरासत में जाने के लिए .active। धन्यवाद! – gibberish

+0

आप पहली जगह स्थिर चर का उपयोग क्यों कर रहे हैं? यह समझदार प्रतीत नहीं होता है। क्या यह 'सक्रिय' विशेषता किसी प्रकार का वैश्विक है, जो सभी 'PanelToggle' उदाहरणों के बीच साझा की जाती है? यदि हां, तो यह वास्तव में वैश्विक क्यों नहीं है? या कुछ और वैश्विक साझा वस्तु में क्यों नहीं है? –

+0

मैं चाहता हूं कि प्रत्येक पैनल टॉगल सबक्लास के पास अपना "सक्रिय" चर हो जिसे किसी उदाहरण के बिना एक्सेस किया जा सके। यदि मैं "ग्लोबल" कीवर्ड के सही तरीके से उपयोग को समझता हूं, तो मुझे स्थानीय चर की तरह सक्रिय करने से पहले 'invoke (..)' में पहले 'ग्लोबल एक्टिव' लाइन डालना होगा। ऐसा करने से एक त्रुटि यह कहती है कि वैश्विक नाम 'सक्रिय' परिभाषित नहीं किया गया है। मुझे यकीन नहीं है कि मैं समझता हूं कि मेरे दृष्टिकोण में क्या गलत है। – gibberish

उत्तर

17

उपयोग type(self) विशेषताओं

>>> class A(object): 
var = 2 
def write(self): 
    print type(self).var 
>>> class B(A): 
pass 
>>> B().write() 
2 
>>> B.var = 3 
>>> B().write() 
3 
>>> A().write() 
2 
+2

'self.__ class__' का उपयोग करने से अलग' प्रकार (स्वयं) 'है? – jorelli

+3

यह फिलहाल नहीं है। लेकिन कुछ सुविधाओं को बाद में लागू किया जा सकता है। फ़ंक्शन टाइप करने के लिए आप कुछ बंदर पैच भी कर सकते हैं। – Odomontois

2

आप वर्ग के माध्यम से active उपयोग कर सकते हैं यह के अंतर्गत आता है यहां पाया जा सकता है: http://gist.github.com/522619


self परिवर्तनीय (नाम द्वारा self नामित) कक्षा का वर्तमान उदाहरण है, जो निश्चित रूप से पारित किया गया है लेकिन स्पष्ट रूप से प्राप्त किया गया है। वर्ग के लिए उपयोग के लिए

class A(object): 

    answer = 42 

    def add(self, a, b): 
     """ ``self`` is received explicitely. """ 
     return A.answer + a + b 

a = A() 

print a.add(1, 2) # ``The instance -- ``a`` -- is passed implicitely.`` 
# => 45 

print a.answer 
# => print 42 
+0

हां, लेकिन मैं OBJECT_OT_openConstraintPanel के साथ ऐसा करने में सक्षम होना चाहता हूं। मैं चाहता हूं कि यह अपना स्थिर "सक्रिय" चर हो, जिसे पैनल टॉगल से विरासत में मिला हो। मैं subclass में "invoke" विधि का काम भी करना चाहता हूं (अपने माता-पिता के बजाय अपने स्वयं के "सक्रिय" चर का उपयोग करें) – gibberish

+0

मेरी पोस्ट संपादित करें और http://gist.github.com/522619 में नमूना कोड जोड़ा, उम्मीद है कि मदद करता है. – miku

+0

आह, वह कोड जो आपने लिंक किया था, वही था जो मुझे चाहिए, धन्यवाद! – gibberish