2012-10-04 9 views
47

मैं एक प्रकार की उपयोगिता कक्षा बनाना चाहता हूं जिसमें केवल स्थिर विधियां हैं जो नाम वर्ग उपसर्ग द्वारा कॉल करने योग्य हैं।पायथन कक्षा स्थैतिक विधियां

class FileUtility(): 

    @staticmethod 
    def GetFileSize(self, fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(self, fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath 

अब मेरी "मुख्य" विधि:

from FileUtility import * 
def main(): 
     path = 'C:\config_file_list.txt' 
     dir = FileUtility.GetFilePath(path) 
     print dir 

और मैं एक त्रुटि मिली: unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead) की तरह मैंने कुछ गलत :)

यहाँ मेरी छोटी सी वर्ग है कर रहा हूँ लगता है।

  1. क्या मैं गलत कर रहा हूँ:

    एक यहाँ कुछ प्रश्न हैं? क्लासनाम द्वारा स्थिर विधि को कॉल करने योग्य नहीं होना चाहिए?

  2. क्या मुझे वास्तव में उपयोगिता वर्ग की आवश्यकता है, या क्या पाइथन में इसे प्राप्त करने के अन्य तरीके हैं?
  3. अगर मैं में मुख्य मैं हो रही है कोड को बदलने की कोशिश: TypeError: GetFilePath() takes exactly 1 argument (2 given)

नई main:

from FileUtility import * 
def main(): 
    objFile = FileUtility() 
    path = 'H:\config_file_list.txt' 
    dir = objFile.GetFilePath(path) 
    print dir 

उत्तर

82

क्योंकि आप उन कार्यों में से प्रत्येक में एक self तर्क ले जा रहे हैं आपको त्रुटि हो रही है। वे स्थिर हैं, आपको इसकी आवश्यकता नहीं है।

हालांकि, ऐसा करने का 'पायथनिक' तरीका स्थिर विधियों से भरा वर्ग नहीं है, बल्कि उन्हें मॉड्यूल में केवल निःशुल्क कार्य करने के लिए है।

#fileutility.py: 

def get_file_size(fullName): 
    fileSize = os.path.getsize(fullName) 
    return fileSize 


def get_file_path(fullName): 
    filePath = os.path.abspath(fullName) 
    return filePath 

अब, अपने अन्य अजगर फाइलों में

import fileutility 

fileutility.get_file_size("myfile.txt") 
fileutility.get_file_path("that.txt") 

यह स्थिर तरीकों विशेष रूप से उल्लेख नहीं है (यह मानते हुए fileutility.py एक ही निर्देशिका में या PYTHONPATH पर है), लेकिन आप कर रहे हैं एक अलग भाषा से आ रहा है, PEP 8, पायथन शैली मार्गदर्शिका एक अच्छा पठन और परिचय है कि कैसे पाइथन प्रोग्रामर सोचते हैं।

+0

हाय कोलिन,, उत्तर के लिए धन्यवाद के रूप में आप का सुझाव दिया, विधि की सूची के साथ और मुख्य में सादे अजगर फ़ाइल मैंने किया: dir = FileUtility.GetFilePath (पथ) मुझे एक त्रुटि मिली: अनबाउंड विधि GetFilePath() को FileUtility उदाहरण के साथ पहले तर्क के रूप में जाना जाना चाहिए (इसके बजाय str instance मिला) – ilyaw77

+0

क्षमा करें, पहले रन पर वहां एक भटक गए स्व को छोड़ दें। क्या आपके पास अभी भी फाइलउटिलिटी क्लास है? – Collin

+1

बिंदु यह है कि आपके पास क्लास फ़ाइल उपयोगिता नहीं होनी चाहिए। जैसे ही आप सी ++ में मुफ्त फ़ंक्शन लिख सकते हैं, आपको वही करना चाहिए। मॉड्यूल नाम (जो फाइलों के लिए मानचित्र) सभी कम मामले भी होना चाहिए। – Collin

8

आप वास्तव में अजगर में स्थिर तरीकों नहीं बनाने दिया जाना चाहिए। आपको क्या करना चाहिए, उन्हें वैश्विक कार्य स्तर पर रखना है, और फिर उस मॉड्यूल तक पहुंचना है जब आप उन्हें कॉल करते हैं।

foo.py:

def bar(): 
    return 42 

baz.py:

import foo 
print foo.bar() 
4

अजगर में, जावा की तरह (या जो भी) static तरीकों व्यापक रूप से इस्तेमाल नहीं कर रहे हैं के रूप में वे वास्तव में एक की जरूरत नहीं है उद्देश्य।

इसके बजाय, आप बस अपने "तरीकों" कार्य के रूप में एक मॉड्यूल में परिभाषित करना चाहिए:

#module1.py 
def fun1(): 
    return do_stuff() 
def fun2(arg): 
    return do_stuff_with_arg(arg) 

#main.py 
import module1 
if __name__ == '__main__': 
    a = module1.fun() 
    print module1.fun2(a) 
6

स्टेटिक तरीकों वस्तु पहले पैरामीटर (कोई वस्तु) के रूप में पास

self पैरामीटर को निकालने और कॉल काम करना चाहिए नहीं मिलता है। आयात समस्या भी प्रासंगिक है। और स्थिर टिप्पणी भी प्रासंगिक है।

1

यदि आप कक्षा में परिभाषित अपने कार्यों का उपयोग करना चाहते हैं, तो आपको बस अपनी कक्षा का एक उदाहरण बनाना होगा और फ़ंक्शन लागू करना होगा।

तो परिणाम है:

dir = FileUtility().GetFilePath(path) 

बस जोड़ने() अपने वर्ग के नाम के बाद।

@staticmethod की आवश्यकता नहीं है क्योंकि आप मानक फ़ंक्शन का उपयोग कर रहे हैं, स्थिर नहीं। लेकिन आपके मामले में परिणाम वही है।

2

विधियों की परिभाषा में बस self हटा दें। आपका इरादा स्थिर के रूप में उपयोग करना है। स्वयं उस वर्ग के उदाहरण के साथ काम करना है।

0

बस फ़ंक्शन परिभाषा में स्वयं को हटा दें। चूंकि आप स्थिर कार्यों का उपयोग कर रहे हैं, इसलिए आपको कार्यों के लिए तर्क के रूप में स्वयं को पारित करने की आवश्यकता नहीं है। तो अपने वर्ग और समारोह इस तरह होना चाहिए:

class FileUtility(): 

    @staticmethod 
    def GetFileSize(fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath 

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

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