2017-03-31 1 views
0

Ich habe eine Klasse mit Variablen (int, string und list). Und ich möchte @property verwenden, um den Wert von Variablen zu erhalten, um Werte für diese Variablen festzulegen. Ich könnte dieses Konzept für int und string Variablen implementieren, aber nicht für list. Bitte helfen Sie mir, es auch für die Liste zu implementieren.Python-Eigenschaft und Setter für Liste wie int und Strings

class MyClass: 

    def __init__(self): 
     self._a = 1 
     self._b = 'hello' 
     self._c = [1, 2, 3] 

    @property 
    def a(self): 
     print(self._a) 

    @a.setter 
    def a(self, a): 
     self._a = a 

    @property 
    def b(self): 
     print(self._b) 

    @b.setter 
    def b(self, b): 
     self._b = b 


my = MyClass() 

my.a 
# Output: 1 
my.a = 2 
my.a 
# Output: 2 

my.b 
# Output: hello 
my.b = 'world' 
my.b 
# Output: world 


# Need to implement: 
my.c 
# Output: [1, 2, 3] 
my.c = [4, 5, 6] 
my.c 
# Output: [4, 5, 6] 
my.c[0] = 0 
my.c 
# Output: [0, 5, 6] 
my.c[0] 
# Output: 0 

Ich habe ähnliche Fragen gefunden, aber sie für mich nicht passen, weil auf diese Weise Operationen zur Liste Aufruf von int und String unterscheiden würde:

+0

Können Sie diese Verschlankung auf einen [Minimal, vollständig und prüfbare] (http://stackoverflow.com/ help/mcve) Beispiel. Das erleichtert es uns, Ihnen zu helfen. –

+0

@ stephen-rauch Danke. Ich habe den Code versehentlich zweimal aus meinem Notizblock kopiert. Ich habe ein Duplikat meines Codes gelöscht. –

+1

Warum drucken Ihre Eigenschaften * den Wert, anstatt ihn zurückzugeben? Und warum hast du sogar Immobilien? Wenn Leute sagen, dass Sie in Python keine Getter und Setter brauchen, weil Python Eigenschaften hat, bedeutet das nicht, dass Sie Eigenschaften überall verwenden sollten; es bedeutet, dass Sie reguläre Attribute verwenden sollten, und wenn es sich herausstellt, dass Sie etwas Logik zum Abrufen oder Festlegen des Attributs hinzufügen müssen, * dann * bringen Sie eine 'Eigenschaft' mit. – user2357112

Antwort

0

Also ich glaube dein missverstanden Anding stammt davon, nicht zu erkennen, dass alles in Python ist ein Objekt. Es besteht kein Unterschied zwischen list, string oder int. Beachten Sie, dass es in Ihrer Implementierung für die int und die string keinen Unterschied gibt, außer für einige Namen.

Ich habe Ihr Beispiel mit einer einzigen Eigenschaft umformuliert und Ihnen dann alle Ihre Anwendungsfälle zugewiesen, um zu überprüfen, ob es in allen Fällen funktioniert.

Code:

class MyClass: 
    def __init__(self): 
     self.my_prop = None 

    @property 
    def my_prop(self): 
     return self._my_prop 

    @my_prop.setter 
    def my_prop(self, my_prop): 
     self._my_prop = my_prop 

Testcode:

my = MyClass() 

my.my_prop = 1 
assert 1 == my.my_prop 
my.my_prop = 2 
assert 2 == my.my_prop 

my.my_prop = 'hello' 
assert 'hello' == my.my_prop 
my.my_prop = 'world' 
assert 'world' == my.my_prop 

my.my_prop = [1, 2, 3] 
assert [1, 2, 3] == my.my_prop 
my.my_prop = [4, 5, 6] 
assert [4, 5, 6] == my.my_prop 
my.my_prop[0] = 0 
assert [0, 5, 6] == my.my_prop 
assert 0 == my.my_prop[0]