0

私は .self で python を教えられており、作成しようとしている非常に単純なクラスについて助けが必要です。私はそれを使用するたびに新しいクラス変数を宣言する必要なしに、さまざまなモジュールで InitLog クラスの外部のすべてを使用したいと思います (たとえば、クラスを使用したいすべての (多数の) モジュールで betty = Initlog を宣言したくありません.. .これを行う方法はありますか?事前に感謝します

import os
import sys
import pdb
import fileinput
import Tools


class InitLog:
    def __init__(self):
        pass
    def Update(self):
        self.sound = sound
        self.engine = engine

    def save(self):

        self.summery = 'sound: ' + self.sound + '\n'
        self.summery += 'engine: ' + self.engine + '\n'


        #lock for use within threads
        Tools.Locked.State.LogAddress = False
        while Tools.Locked.State.LogAddress == True: pass
        Tools.Locked.State.LogAddress = True

        try: os.remove(path + '/' + self.dest + '/init.log')
        except: pass

        path = os.getcwd()
        if not os.path.exists(self.dest): os.makedirs(self.dest)
        if os.path.isfile(path + '/' + self.dest + '/init.log') == True: os.remove(path + '/' + self.dest + '/init.log')
        with open (path + '/' + self.dest + '/init.log', mode='a', encoding='utf-8') as a_file:
            a_file.write(self.summery)
        Tools.Locked.State.LogAddress = False



InitLog.Update.sound = 'on'
InitLog.Update.engine = 'google.txt'
InitLog.save()

エラー:TypeError: save() takes exactly 1 positional argument (0 given)

編集:

冗長性を減らすために、上記の例を簡略化しました。

以前使用していた作業コードは次のとおりです (新しいクラス変数を宣言せずに InitLog を使用するという元の要求を試みる前)

import os
import sys
import pdb
import fileinput
import Tools


class InitLog:
    def __init__(self):
        pass
    def setLaws(self):
        self.sound = 'off'
        self.engine = 'google.txt'


    def Update(self):
        while Tools.Locked.State.LogAddress == True: pass
        Tools.Locked.State.LogAddress = True
        try: os.remove(path + '/' + self.dest + '/init.log')
        except: pass

        summery = 'sound: ' + self.sound + '\n'
        summery += 'engine: ' + self.engine + '\n'


        path = os.getcwd()
        if not os.path.exists(self.dest): os.makedirs(self.dest)
        if os.path.isfile(path + '/' + self.dest + '/init.log') == True: os.remove(path + '/' + self.dest + '/init.log')
        with open (path + '/' + self.dest + '/init.log', mode='a', encoding='utf-8') as a_file:
            a_file.write(summery)
        Tools.Locked.State.LogAddress = False

Tools.Locked.State.LogAddress = False
log = InitLog()
log.setLaws()
log.sound = 'on'
log.Update()

log = InitLog()このクラスを使用する必要があるすべてのモジュールについて言う必要はありません

4

1 に答える 1

0

クラスを適切に使用していません。

次のコード:

InitLog.Update.sound = 'on'
InitLog.Update.engine = 'google.txt'
InitLog.Update.countryspec = '.com'
InitLog.Update.limit = '10'
....

クラス InitLog の Update のメソッド オブジェクトにアクセスし、その場で属性を追加しています。この属性は、クラスまたはそのクラスのオブジェクトではなく、関数オブジェクトに関連付けられています。

error: TypeError: save() takes exactly 1 positional argument (0 given)save は、InitLog オブジェクトのインスタンスが呼び出したときに暗黙的に設定されるパラメーター self を必要とするメソッドです。

コードを通じて単一のインスタンスが必要な場合は、シングルトン設計パターンに従うことができます。

最初にhttp://docs.python.org/tutorial/classes.htmlに目を通すことをお勧めします

たぶん、あなたは次のようなことを達成しようとしています:

class InitLog:
    sound = None
    engine = None
    summary = ""
    @classmethod
    def save(cls):
        cls.summary = 'sound: ' + cls.sound + '\n'
        cls.summary += 'engine: ' + cls.engine + '\n'

InitLog.sound = 'On'
InitLog.engine = 'google.txt'
InitLog.save()
print InitLog.summary 

後で再利用できる別のデザインを次に示します。

class InitLog:
    custom_instance = None
    def __init__(self):
        self.sound = None
        self.engine = None
        self.summary = ''
    @property
    def sound(self):
        return self.sound
    @sound.setter
    def set_sound(self, sound):
        self.sound = sound
    @property
    def engine(self):
        return self.engine
    @engine.setter
    def set_engine(self, engine):
        self.engine = engine
    @property
    def summary(self):
        return self.summary
    @summary.setter
    def set_summary(self, summary):
        self.summary = summary
    def update(self, **kwargs):
        if 'sound' in kwargs:
            self.sound = kwargs['sound']
        if 'engine' in kwargs:
            self.engine = kwargs['engine']
    def save(self):
        self.summary = 'sound: ' + self.sound + '\n'
        self.summary += 'engine: ' + self.engine + '\n'
    @classmethod
    def get_custom_instance(cls):
        if not cls.custom_instance:
            cls.custom_instance = InitLoc()
            cls.custom_instance.engine = 'google.txt'
            cls.custom_instance.sound = 'on'
        return cls.custom_instance

obj = InitLog.get_custom_instance()
obj.save()
print obj.summary  #ouput => 'sound: on\nengine: google.txt\n'
print obj.update(sound = 'Off')
obj.save()
print obj.summary  #output =>'sound: Off\nengine: google.txt\n'

Python クラスまたは一般的なクラスを設計する方法は多数ありますが、これは 2 つにすぎません。ガイドを参照して、ニーズに合った最適な設計を見つけてください。

于 2012-06-17T04:57:34.440 に答える