2009-06-16 9 views
7

नीचे कक्षा बी में मैं कक्षा 12 में __set__ फ़ंक्शन चाहता था जब भी आप B().a पर कोई मान निर्दिष्ट करते हैं। इसके बजाय, मान को B().a पर मान सेट करने के साथ B().a ओवरराइट करें। क्लास सी C().a को सही तरीके से काम करता है, लेकिन मैं प्रत्येक उपयोगकर्ता वर्ग के लिए ए का एक अलग उदाहरण चाहता था, यानी मैं अन्य सभी मामलों में 'ए' बदलने के लिए सी() के एक उदाहरण में 'ए' को बदलना नहीं चाहता हूं। मैंने समस्या को समझने में मदद के लिए कुछ परीक्षण लिखे हैं। क्या आप मुझे कक्षा को परिभाषित करने में मदद कर सकते हैं जो test1 और test2 दोनों को पारित करेगा?__init__ फ़ंक्शन में एक वर्णक वर्ग की घोषणा क्यों वर्णनकर्ता कार्यक्षमता को तोड़ती है?

class A(object): 
    def __set__(self, instance, value): 
     print "__set__ called: ", value 

class B(object): 
    def __init__(self): 
     self.a = A() 

class C(object): 
    a = A() 

def test1(class_in): 
    o = class_in() 
    o.a = "test" 
    if isinstance(o.a, A): 
     print "pass" 
    else: 
     print "fail" 

def test2(class_in): 
    o1, o2 = class_in(), class_in() 
    if o1.a is o2.a: 
     print "fail" 
    else: 
     print "pass" 

उत्तर

4

तदनुसार documentation रहे हैं:

निम्न विधियों केवल लागू वर्ग विधि (एक तथाकथित वर्णनकर्ता वर्ग) युक्त का एक उदाहरण कक्षा में प्रकट होता है जब एक और नई शैली के वर्ग, जिसे मालिक वर्ग के रूप में जाना जाता है। नीचे दिए गए उदाहरणों में , "विशेषता" विशेषता का संदर्भ देती है जिसका नाम मालिक वर्ग __dict__ में संपत्ति की कुंजी है। वर्णनकर्ताओं को केवल नए-शैली वाले वर्गों के रूप में लागू किया जा सकता है।

तो आप उदाहरणों पर वर्णनकर्ता नहीं कर सकते हैं।

हालांकि, चूंकि वर्णनकर्ता को इसका उपयोग करने के लिए उपयोग किए जाने वाले उदाहरण के लिए एक रेफरी मिलती है, इसलिए बस इसे संग्रहीत करने के लिए एक कुंजी के रूप में उपयोग करें और उदाहरण के आधार पर आप अलग-अलग व्यवहार कर सकते हैं।

+0

ठीक है, मैं उस – user83753

+0

के साथ रह सकता हूं दूसरे विचार पर, शायद मैं इसके साथ नहीं रह सकता। मेरे आवेदन में मैं सदस्य कार्यों को ए में रखना चाहता हूं जो मालिक वर्ग की स्थिति पर भी निर्भर करता है। तो उदाहरण के लिए: स्वामी (राज्य जानकारी) स्वामी.ए = डेटा स्वामी.ए.फू() foo मालिक से राज्य की जानकारी कैसे प्राप्त करता है? – user83753

+0

@ अज्ञात (google): ओह, इसके लिए आप डेटा को इंस्टेंस पर ही स्टोर करते हैं। तो आप इसे तरीकों से ला सकते हैं। – nosklo

0

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

class E(object): 
    def __new__(cls, state): 
     class E(object): 
      a = A(state) 
      def __init__(self, state): 
       self.state = state 
     return E(state) 

#>>> isinstance(E(1), E) 
#False 
+0

वह एक क्लास फ़ैक्टरी फ़ंक्शन है, जिसे कक्षा – nosklo

+0

के रूप में छिपाया गया है हां, और इसके बारे में गर्व है। – user83753

0

मुझे इसी तरह के मुद्दे से काट दिया गया था कि मैं ऑब्जेक्ट्स को एक वर्णक द्वारा शासित विशेषताओं के साथ वर्गीकृत करना चाहता था। जब मैंने ऐसा किया, मैंने देखा कि गुण सभी वस्तुओं में अधिलेखित किए जा रहे थे जैसे कि वे व्यक्तिगत नहीं थे।

मैं एक ऐसा सवाल उठाया और उसके एवज में जवाब यहाँ है: class attribute changing value for no reason

एक अच्छा दस्तावेज़ लिंक वर्णनकर्ता पर चर्चा यहाँ है: http://martyalchin.com/2007/nov/24/python-descriptors-part-2-of-2/

ऊपर उल्लिखित लिंक से एक उदाहरण वर्णनकर्ता नीचे है:

class Numberise(object): 
    def __init__(self, name): 
     self.name = name 

    def __get__(self, instance, owner): 
     if self.name not in instance.__dict__: 
      raise (AttributeError, self.name) 
     return '%o'%(instance.__dict__[self.name]) 

    def __set__(self, instance, value): 
     print ('setting value to: %d'%value) 
     instance.__dict__[self.name] = value 
संबंधित मुद्दे