के भीतर भी उपयोग योग्य है, मैं पाइथन में एक विरासत वर्ग के रूप में "उप-संचार" प्रणाली को लागू करने की कोशिश कर रहा हूं।कक्षा में एक सजावट को परिभाषित करना, जो वर्ग परिभाषा
from command import Command
import sys
class MyCommand(Command):
@Command.subcommand
def foo(self):
print "this can be run as a subcommand"
def bar(self):
print "but this is a plain method and isn't exposed to the CLI"
MyCommand()(*sys.argv)
# at the command line, the user runs "mycommand.py foo"
मैं एक स्थिर पद्धति के रूप में Command.subcommand
कार्यान्वित किया है और सब कुछ ठीक काम किया जब तक मैं माता पिता के वर्ग है, जो मुझे TypeError: 'staticmethod' object is not callable
मिला करने के लिए एक subcommand जोड़ने की कोशिश की: मेरी उम्मीद उपयोग के मामले में कुछ की तरह है। मसा में, यह स्पष्ट है कि this काम नहीं करेगा:
class Command(object):
@staticmethod
def subcommand(method):
method.is_subcommand = True
return method
@subcommand
def common(self):
print "this subcommand is available to all child classes"
एकमात्र विकल्प मैं अब तक मिल गया है माता पिता कक्षा के बाहर subcommand
डेकोरेटर घोषित करने के लिए है, तो यह इंजेक्षन के बाद वर्ग परिभाषा पूरा हो गया है है।
def subcommand(method):
method.is_subcommand = True
return method
class Command(object):
@subcommand
def common(self):
print "this subcommand is available to all child classes"
Command.subcommand = staticmethod(subcommand)
del subcommand
हालांकि, कोई है जो अजगर इस्तेमाल कभी नहीं से पहले सज्जाकार जोड़ा गया था के रूप में, यह बहुत ही भद्दा मेरे लिए लगता है। क्या इसे पूरा करने के लिए एक और शानदार तरीका है?
खैर, पहला सवाल यह है कि आप एक सजावट को कक्षा में एक विधि के रूप में क्यों लागू करते हैं, जब तक उस वर्ग का उपयोग सजावट के समूह के लिए नहीं किया जाता है। और यदि यह इसके लिए है, तो आप सजावट को "आम" क्यों सजा रहे हैं? यह संभवतः घबराहट महसूस करता है क्योंकि आपकी कक्षा का डिज़ाइन थोड़ा अजीब है ... :) –
आप इस सजावटकर्ता को आपके लिए क्या उम्मीद कर रहे हैं? पाइथन पहले से ही जानता है कि उपमहाद्वीप क्या हैं, क्योंकि यह जानता है कि कक्षाएं दूसरों के उप-वर्ग हैं। –
@Lennart - शुद्ध रूप से आयात सौंदर्यशास्त्र के लिए। मैं 'आयात कमांड का प्रशंसक नहीं था ... कक्षा MyCommand (कमांड। कमांड)' (अनावश्यक लगता है) या 'कमांड आयात * से ... @ उपसमंद' (नामस्थान को प्रदूषित करने जैसा लगता है)। –