2012-05-30 22 views
17

मुझे पाइथन सुपर() और विरासत और गुणों के साथ वास्तव में एक अजीब समस्या है। सबसे पहले, कोड:पायथन सुपर और सेटिंग पेरेंट क्लास प्रॉपर्टी

#!/usr/bin/env python3 

import pyglet 
import pygame 

class Sprite(pyglet.sprite.Sprite): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.rect = pygame.Rect(0, 0, self.width, self.height) 
     self.rect.center = self.x, self.y 

    @property 
    def x(self): 
     return super().x 

    @x.setter 
    def x(self, value): 
     super(Sprite, self.__class__).x.fset(self, value) 
     self.rect.centerx = value 

    @property 
    def y(self): 
     return super().y 

    @y.setter 
    def y(self, value): 
     super(Sprite, self.__class__).y.fset(self, value) 
     self.rect.centery = value 

यह ठीक काम करता है। हालांकि, मैं क्या चाहते हैं (मुझे क्या pythonic लगता है)

#super(Sprite, self.__class__).x.fset(self, value) 
super().x = value 

भले ही

super().x 

मूल्य ठीक हो जाता है काम नहीं करता। इस मामले में एक्स सुपरसेट की एक संपत्ति है जो दोनों fset और fget परिभाषित है। तो यह क्यों काम नहीं करता है?

उत्तर

15

मैं बैक अप लेने के लिए सही भाषा खोजने का प्रयास कर रहा था, यह व्यवहार क्यों है, इसलिए आपको "क्योंकि यह सिर्फ" उत्तर देने के लिए नहीं है ... लेकिन ऐसा लगता है कि इस सवाल से और पूछा गया है एक बार से, और यह super() के व्यवहार के लिए उबाल जाता है। आप यहां इस सटीक व्यवहार के बारे में 2010 की चर्चा देख सकते हैं: http://mail.python.org/pipermail/python-dev/2010-April/099672.html

आखिरकार, यह वास्तव में केवल सुपर() कॉल पर आ जाता है जो आपको सीधे गेटर्स तक पहुंचने देता है, न कि सेटर्स। सेटर्स को या __set__() के माध्यम से एक्सेस किया जाना चाहिए। यह शायद सबसे आसान समझाया गया है क्योंकि "सुपर() कार्यक्षमता सिर्फ इसका समर्थन नहीं करती है"। यह "सेट" ऑपरेशन की संपत्ति कार्यक्षमता को हल करेगा, बाएं हाथ में असाइनमेंट में सेटर नहीं, "सेट" ऑपरेशन में (इसलिए विधि कॉल)। जैसा कि आप इस चर्चा धागे की तारीख से देख सकते हैं, यह स्पष्ट रूप से super() की शुरूआत के बाद से इस तरह से किया गया है।

शायद किसी और के पास विशेष रूप से तकनीकी कारण है, लेकिन स्पष्ट रूप से मुझे यकीन नहीं है कि यह भी मायने रखता है। यदि यह समर्थित नहीं है, तो यह काफी अच्छा कारण है।

+6

मैंने एक बग दायर किया है: http://bugs.python.org/issue14965 उम्मीद है कि यह जल्द ही हल हो जाएगा, इसलिए यह प्रश्न अब प्रासंगिक नहीं है। – darkfeline

+0

"यह समर्थित नहीं है ... एक अच्छा पर्याप्त कारण" जैसा लगता है "क्योंकि यह बस है"। – simonzack

+0

@ सिमोनज़ैक - मैंने कहा था कि मैं * कोशिश कर रहा था * उस तरह का उत्तर देने के लिए नहीं और सबसे अधिक संभवतः इसकी कार्यक्षमता के बारे में बता सकता हूं। – jdi

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

  • कोई संबंधित समस्या नहीं^_^