2012-06-17 80 views
0

我是自學的python,需要一些幫助,我想寫一個非常簡單的類。我想在各種模塊中使用InitLog類以外的所有東西,而無需每次使用它時聲明一個新的類變量(例如,我不想在每個(衆多)模塊中聲明betty = Initlog,我希望使用該類。 ?有沒有一種方法,我可以做到這一點感謝事先python 3 new to classes

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)

編輯:

我已經短路上面的例子要少冗餘

這裏是我以前使用的工作代碼(attepting我原來的請求前使用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()的每一個模塊我需要使用此類

+1

這種類的使用幾乎都是錯誤的。我建議你先回去讀一下關於班級,實例化和方法調用的內容。 – Keith

+0

['@ classmethod'](http://docs.python.org/library/functions.html#classmethod)可以幫助上面的'save()'和'Update()',但是正如Keith所說的,你還有其他問題與代碼 –

+0

嘿邁克,我已經包含了我原來的工作代碼(在決定我不想在每個模塊上聲明InitLog之前) – Rhys

回答

0

您沒有正確使用類。

以下代碼:

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

正在訪問類InitLog的更新的方法的對象,並且在飛行添加屬性到它。這些屬性被附加到函數對象而不是該類或該類的一個對象。

error: TypeError: save() takes exactly 1 positional argument (0 given) save是一種方法,它需要一個參數self,它在InitLog對象的一個​​實例調用它時被隱式設置。

如果你想通過你的代碼的單個實例,那麼你可以按照單例設計模式。

第一,我建議你去通過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,請通過引導,找到適合您需求的最佳設計。

+0

您需要仔細閱讀他的問題......「我想使用InitLog之外的所有東西類在各種模塊中無需每次使用時都聲明一個新的類變量「 –

+0

@MikePennington我已經更新了它,好不好? –

+0

感謝您的回覆,我已經包含了我的原始工作代碼(在決定我不想在每個模塊上聲明InitLog之前)。正如你所看到的,它包含了你所做的更簡單的InitLog聲明 – Rhys