python - पायथन: क्या होता है जब वर्ग विशेषता, उदाहरण विशेषता, और विधि सभी का एक ही नाम होता है?




methods instance-variables (3)

कैसे कॉल करें
कक्षा विशेषता, Exam.test

आप ऐसा नहीं कर सकते क्योंकि def test(self) निष्पादित करते समय नाम test कक्षा में विधि से जुड़ा होता है और "class var" का संदर्भ खो जाता है।

उदाहरण विशेषता test_o.test -> "ठीक है"

आपने पहले ही ऐसा किया है।

विधि test_o.test()

आप इसे इस तरह से कॉल नहीं कर सकते हैं क्योंकि self.test = n निष्पादित करते समय नाम test किसी भी वस्तु के संदर्भ में संदर्भित करता है और उदाहरण में विधि का संदर्भ खो जाता है।

लेकिन जैसा कि अन्य उत्तरों में बताया गया है, आप कक्षा में विधि को कॉल कर सकते हैं और उदाहरण को पास कर सकते हैं: Exam.test(test_o)

पाइथन एक वर्ग विशेषता, उदाहरण विशेषता, और विधि को अलग करता है जब नाम समान होते हैं?

class Exam(object):

    test = "class var"

    def __init__(self, n):
        self.test = n

    def test(self):
        print "method : ",self.test

test_o = Exam("Fine")

print dir(test_o)

print Exam.test
print test_o.test
test_o.test()

आउटपुट:

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',    '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'test']
<unbound method load.test>
Fine
Traceback (most recent call last):
  File "example.py", line 32, in <module>
    test_o.test()
TypeError: 'str' object is not callable

कैसे कॉल करें

  1. कक्षा विशेषता, Exam.test . Exam.test -> <unbound method load.test> आउटपुट विधि दिखाता है
  2. उदाहरण विशेषता test_o.test -> "Fine"
  3. विधि test_o.test() -> TypeError: 'str' object is not callable test_o.test() करने test_o.test() TypeError: 'str' object is not callable

आप विधि विधि के रूप में विधि को कॉल कर सकते हैं और अपना उदाहरण इस में पास कर सकते हैं:

Exam.test(test_o)

या, यदि आप Exam उपयोग नहीं करना चाहते हैं:

type(test_o).test(test_o)

तुम लिख सकते हो

Exam.test(test_o)

या

Exam.test.__get__(test_o)()

बाद के मामले में आप इस तथ्य का उपयोग कर रहे हैं कि विधियां <unbound method load.test> को बाध्य विधि में परिवर्तित करने के लिए <unbound method load.test> , इसलिए आप इसे एकल ब्रैकेट के साथ कॉल कर सकते हैं।

जब आप test_o.test() लिखते हैं, तो पाइथन को यह नहीं पता कि आप एक विधि को कॉल करने का प्रयास कर रहे हैं; हो सकता है कि आप एक फ़ंक्शन या कॉल करने योग्य ऑब्जेक्ट को कॉल करने का प्रयास कर रहे हों जिसे ऑब्जेक्ट पर इंस्टेंस डेटा सदस्य के रूप में स्थापित किया गया हो। इसके बजाय यह ऑब्जेक्ट पर पहले ऑब्जेक्ट test और उसके वर्ग पर दिखाई देता है, लेकिन चूंकि ऑब्जेक्ट पर विशेषता मौजूद है, यह कक्षा पर विधि को छुपाती है।

कक्षा सदस्य

test = "class var"

पहुंच योग्य नहीं है (वास्तव में यह कहीं भी मौजूद नहीं है), क्योंकि यह विधि test द्वारा ओवरराइट किया गया है; जब एक class कथन निष्पादित किया जाता है, तो इसका नामस्थान अपने मेटाक्लास में पारित होने से पहले एक निर्देश में एकत्र किया जाता है, और बाद में नाम पहले के ओवरराइड करते हैं।







class-attributes