0

私は変数がデフォルト値に初期化されるアプリケーションに取り組んでいます。

ユーザーはこれらの値をいつでも変更できます。ユーザーはいつでも一部またはすべての変数をデフォルトにリセットできるはずです。

これを行うための最良の方法はどうですか?

これは解決策になるでしょうが、私はそれが最適ではないと感じています。私の気持ちが正しいかどうか、そしてどうすればそれをより良くすることができるか教えていただけますか?

A_DEFAULT = "A_def"
B_DEFAULT = "B_def"
C_DEFAULT = "C_def"

class BusinessLogic_1(object):
    def __init__(self):
        self.setVariablesToDefault()
    def setVariablesToDefault(self, variableNames=None):
        # pass None to set all Variables to default
        variableNames = variableNames or ["A","B","C"]
        if "A" in variableNames:
            self.A = A_DEFAULT
        if "B" in variableNames:
            self.B = B_DEFAULT
        if "C" in variableNames:
            self.C = C_DEFAULT
    def printVariables(self):
        print  "A: %s, B: %s, C: %s" % (self.A, self.B, self.C)

if __name__ == "__main__":
    print "0: Initialize"
    businessLogic_1 = BusinessLogic_1()
    businessLogic_1.printVariables()

    print "Change A,B,C and then reset A,C"
    businessLogic_1.A = "A_new"
    businessLogic_1.B = "B_new"
    businessLogic_1.C = "C_new"
    businessLogic_1.printVariables()
4

2 に答える 2

1

これは解決策かもしれません。これは、変数の名前を文字列として渡し、これらの名前を介して変数にアクセスする方法です。オブジェクトは同時に複数の名前を持つことができますが、名前は常に (特定の時点で) 1 つのオブジェクトを指します。

class classWithVariablesThatHaveDefaultValues(object):

    def __init__(self, some, example, variables, defaultValuesDict):
        self.some = some
        self.example = example
        self.variables = variables
        self.dictionaryWithDefaultValues = defaultValuesDict

    def resetValues(self, *listOfVariables):
        for variable in listOfVariables:
            for key in self.dictionaryWithDefaultValues:
                if key == variable:            
                    vars(self)[key] = self.dictionaryWithDefaultValues[key]

if __name__ == "__main__":

    defaultValuesDict = {"some":4, "example":5, "variables":6}
    exampleObject = classWithVariablesThatHaveDefaultValues(1, 2, 3, defaultValuesDict)
    exampleObject.some = 15
    print exampleObject.some, exampleObject.example, exampleObject.variables
    exampleObject.resetValues("example", "some")
    print exampleObject.some, exampleObject.example, exampleObject.variables

出力は次のとおりです。

15 2 3

4 5 3

于 2012-12-10T07:06:25.880 に答える
0

仕組みと非常によく似た方法で実現できますがdecimal.localcontext()、ユースケースによっては、これが適切でない場合があります。これにより、更新された値を反映する元のオブジェクトの任意のメソッドを操作して呼び出すことができ、withブロックの最後でそれらを入力時の値にリセットできます。

from contextlib import contextmanager

class A(object):
    def __init__(self):
        self.a = 3
        self.b = 5
    def display(self):
        return self.a, self.b

a = A()

@contextmanager
def mycontext(obj):
    old_a = obj.a
    old_b = obj.b
    yield obj
    obj.a = old_a
    obj.b = old_b


print 'before:', a.display()
with mycontext(a) as obj:
    print 'entered:', a.display()
    a.a = 3
    a.b = 7
    print 'changed:', a.display()


print 'hopefully original', a.display()

before: (3, 5)
entered: (3, 5)
changed: (3, 7)
hopefully original (3, 5)
于 2012-11-15T17:25:11.870 に答える