2010-11-06 14 views
8

माणिक में आप यह कर सकते हैं:पायथन में कक्षा विधि कैसे बनाएं?

class A 
    def self.a 
     'A.a' 
    end 
end 

puts A.a #-> A.a 

कैसे इस अजगर में किया जा सकता। मुझे कक्षा के एक उदाहरण पर बुलाए बिना कक्षा के एक तरीके की आवश्यकता है।

@staticmethod 
def foo():  # No implicit parameter 
    print 'foo' 


@classmethod 
def foo(cls): # Class as implicit paramter 
    print cls 

अंतर यह है कि है:

class A 
    def a(): 
     return 'A.a' 

print A.a() 

उत्तर

17

जो आप खोज रहे हैं वह staticmethod सजावटी है, जिसका उपयोग उन तरीकों को बनाने के लिए किया जा सकता है जिन्हें पहले निहित तर्क की आवश्यकता नहीं होती है। यह इस तरह से इस्तेमाल किया जा सकता:

class A(object): 
    @staticmethod 
    def a(): 
     return 'A.a' 

दूसरी ओर, आप विधि से वर्ग (नहीं उदाहरण) का उपयोग करना चाहते हैं, आप classmethod डेकोरेटर, जो ज्यादातर एक ही तरह से प्रयोग किया जाता है का उपयोग कर सकते हैं:

class A(object): 
    @classmethod 
    def a(cls): 
     return '%s.a' % cls.__name__ 

कौन सा अभी भी वस्तु (A.a()) instanciating बिना कहा जा सकता है।

9

ऐसा करने के दो तरीके हैं:

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead) 

यह है कि मैं क्या करने की कोशिश की है: जब मैं यह करने के लिए कोशिश मैं इस त्रुटि मिलती है एक स्थैतिक विधि में कोई अंतर्निहित पैरामीटर नहीं है। एक वर्ग विधि उस वर्ग को प्राप्त करती है जिसे इसे उसी तरह से बुलाया जाता है जैसे एक सामान्य विधि उदाहरण प्राप्त करती है।

आप जो भी उपयोग करते हैं, उस पर निर्भर करता है कि क्या आप कक्षा तक पहुंच प्राप्त करना चाहते हैं या नहीं।

किसी को भी उदाहरण के बिना बुलाया जा सकता है।

0

तुम भी __class__ का उपयोग कर एक स्थिर विधि में वर्ग वस्तु का उपयोग कर सकते हैं:

class A() : 
    @staticmethod 
    def a() : 
     return '{}.a'.format(__class__.__name__) 

कम से कम इस अजगर में काम करता है 3.1

+0

2.x में काम नहीं करता है –

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