मुझे पता है कि सवाल पहले भी पूछा जा चुका है, लेकिन मैं खुद को उन स्थितियों में टकराता हुआ पाता हूं जहां एक स्टेटिकमेथोड सबसे उपयुक्त है, लेकिन इस वर्ग के अंदर एक इंस्टेंस वेरिएबल को संदर्भित करने की भी आवश्यकता है। उदाहरण के तौर पर, मान लें कि मेरे पास निम्न वर्ग है:

class ExampleClass(object):
    def __init__(self, filename = 'defaultFilename'):
        self.file_name = filename

    @staticmethod
    def doSomethingWithFiles(file_2, file_1 = None):
         #if user didn't supply a file use the instance variable 
         if file_1 is None:
            # no idea how to handle the uninitialized class case to create
            # self.file_name. 
            file_1 = __class__.__init__().__dict__['file_name'] <--- this seems sketchy
         else:
            file_1 = file_1
         with open(file_1, 'r') as f1, open(file_2, 'w') as f2:
            .....you get the idea...

    def moreMethodsThatUseSelf(self):
        pass

अब मान लीजिए कि मेरे पास __init__ में पारित विभिन्न फ़ाइल नामों के साथ उदाहरण क्लास (ई 1, ई 2, ई 3) के कुछ उदाहरण थे, लेकिन एक प्रारंभिक कक्षा का उपयोग करने की क्षमता को बनाए रखना चाहते हैं। file_name) या E1.doSomethingWithFiles(file_2 = E2.file_name, file_1 = 'some_other_file') जैसी स्थिति की आवश्यकता है।

क्या मेरे लिए कोई कारण है कि मैं जो सोच रहा हूं उसे करने का तरीका खोजने की कोशिश कर रहा हूं, या क्या मैं गड़बड़ कर रहा हूं?

अपडेट करें मुझे लगता है कि टिप्पणियां सहायक हैं और मुझे यह भी लगता है कि यह एक ऐसा मुद्दा है जिसका मैं खराब डिजाइन के कारण सामना कर रहा हूं।

यह मुद्दा एचडीएफ5 फाइलों तक समवर्ती पहुंच को रोकने के लिए एक तरह से शुरू हुआ, जिसमें प्रत्येक वर्ग के उदाहरण को एक रॉलॉक दिया गया था जिसे मैं उपयोग में होने के दौरान फ़ाइल तक पहुंचने के किसी भी अन्य प्रयास को रोकने के लिए संदर्भ प्रबंधक के रूप में उपयोग कर सकता था। प्रत्येक वर्ग के उदाहरण का अपना स्वयं का रलॉक था जिसे उसने हासिल किया और जारी किया जब उसे जो कुछ भी करने की आवश्यकता थी, उसके साथ किया गया। मैं एक रूटीन करने के लिए @staticmethod का भी उपयोग कर रहा था, जिसने तब एक फाइल जेनरेट की थी जो अपने init() में पास की गई थी और प्रत्येक क्लास इंस्टेंस के लिए अद्वितीय थी। उस समय यह चतुर लग रहा था, लेकिन मुझे इसका पछतावा है। मुझे यह भी लगता है कि मैं पूरी तरह से अनिश्चित हूं जब @staticmethods हमेशा उपयुक्त होते हैं और शायद इसे @classmethods के साथ भ्रमित कर रहे थे, लेकिन एक वर्ग चर अब मेरे वर्ग के उदाहरणों के लिए अद्वितीय रॉक्स और फाइलें नहीं बनाएगा। मुझे लगता है कि मुझे शायद डिजाइन बनाम एक वर्ग परिभाषा का उपयोग करने का औचित्य साबित करने की कोशिश करने के बारे में अधिक सोचना चाहिए, मैं वास्तव में उस तरीके से समझ नहीं पा रहा हूं जिससे इसे बचाने के लिए डिज़ाइन किया गया था।

1
user5960761 2 अप्रैल 2018, 05:12

3 जवाब

उदाहरण को स्थिर विधि के पैरामीटर के रूप में इनपुट क्यों न करें। मुझे उम्मीद है कि यह कोड मददगार होगा।

 class ClassA:
    def __init__(self, fname):
        self.fname = fname

    def print(self):
        print('fname=', self.fname)

    @staticmethod
    def check(f):
        if type(f)==ClassA :
            print('f is exist.')
            f.print()
            print('f.fname=', f.fname)
        else:
            print('f is not exist: new ClassA')
            newa = ClassA(f)
            return newa


a=ClassA('temp')
b=ClassA('test')
ClassA.check(a)
ClassA.check(b)
newa = ClassA.check('hello')
newa.print()
0
Junhee Shin 2 अप्रैल 2018, 02:36

आप एक स्थिर विधि से एक आवृत्ति विशेषता का उल्लेख नहीं कर सकते। मान लीजिए कि कई उदाहरण मौजूद हैं, आप किसमें से विशेषता चुनेंगे?

आपको एक वर्ग विशेषता और एक वर्ग विधि की आवश्यकता प्रतीत होती है। आप classmethod डेकोरेटर का उपयोग करके एक को परिभाषित कर सकते हैं।

class ExampleClass(object):
    file_name = 'foo'

    @classmethod
    def doSomethingWithFiles(cls, file_2, file_1 = None):
        file_1 = cls.file_name
        # Do stuff
0
Olivier Melançon 2 अप्रैल 2018, 03:00

हो सकता है कि मैं गलत समझ रहा हूं कि आपके इरादे क्या हैं लेकिन मुझे लगता है कि आप डिफ़ॉल्ट पैरामीटर का दुरुपयोग कर रहे हैं। ऐसा प्रतीत होता है कि आप 'defaultFilename' को डिफ़ॉल्ट पैरामीटर मान के रूप में उपयोग करने का प्रयास कर रहे हैं। क्यों न सिर्फ अजीब को छोड़ें

 if file_1 is None:
        # no idea how to handle the uninitialized class case to create
        # self.file_name. 
        file_1 = __class__.__init__().__dict__['file_name'] <--- this seems sketchy

और फ़ंक्शन को निम्नानुसार बदलें,

def doSomethingWithFiles(file_2, file_1='defaultFilename'):

यदि हार्डकोडिंग वह मान आपको असहज करता है तो शायद कोशिश करें

class ExampleClass(object):
    DEFAULT_FILE_NAME = 'defaultFilename'

    def __init__(self, filename=DEFAULT_FILE_NAME):
        self.file_name = filename

    @staticmethod
    def doSomethingWithFiles(file_2, file_1=DEFAULT_FILE_NAME):
         with open(file_1, 'r') as f1, open(file_2, 'w') as f2:
            # do magic in here

    def moreMethodsThatUseSelf(self):
        pass

सामान्य तौर पर, हालांकि, आप शायद अपनी समस्या को गलत तरीके से मॉडलिंग कर रहे हैं यदि आप एक स्थिर विधि के अंदर एक आवृत्ति चर का उपयोग करना चाहते हैं।

0
Skam 3 अप्रैल 2018, 14:23