0

我是在 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 是一种方法,它需要一个参数 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,请仔细阅读指南并找到适合您需求的最佳设计。

于 2012-06-17T04:57:34.440 回答