Seite 1 von 1
property mit 2 Parameter
Verfasst: Montag 5. März 2007, 16:52
von Twilo
Hallo,
wie kann ich einer fset property 2 Parameter uebergeben?
Code: Alles auswählen
class test(object):
def test(self, bla, blub):
pass
hm = property(fset=test)
help = test()
help.hm = 1, 2
Traceback (most recent call last):
File "singleton.py", line 32, in ?
help.hm = 1, 2
TypeError: test() takes exactly 3 arguments (2 given)
mfg
Twilo
Verfasst: Montag 5. März 2007, 17:06
von DatenMetzgerX
übergibst halt eine Liste
Code: Alles auswählen
>>> class test(object):
... def test(self, dudu):
... pass
... hm=property(fset=test)
...
>>> help = test()
>>> help.hm = [1,2]
Re: property mit 2 Parameter
Verfasst: Dienstag 6. März 2007, 06:56
von sape
Twilo hat geschrieben:Hallo,
wie kann ich einer fset property 2 Parameter uebergeben?
Garnicht.
Ein Set-Property sorgt dafür das du statt ``foo.bar(1)`` eben ``foo.bar = 1`` schreibst und daher kann nur ein Parameter übergeben werden.
Verfasst: Dienstag 6. März 2007, 13:58
von mitsuhiko
Code: Alles auswählen
>>> class MyClass(object):
... def foo(self, val):
... self._foo = val
... foo = property(lambda s: s._foo, foo)
...
>>> m = MyClass()
>>> m.foo = 1, 2
>>> m.foo
(1, 2)
Verfasst: Dienstag 6. März 2007, 15:52
von sape
blackbird hat geschrieben:Code: Alles auswählen
>>> class MyClass(object):
... def foo(self, val):
... self._foo = val
... foo = property(lambda s: s._foo, foo)
...
>>> m = MyClass()
>>> m.foo = 1, 2
>>> m.foo
(1, 2)
Da werden keine zwei Parameter übergeben sondern ein ``tuple``, was man auch nicht so kompliziert schreiben muss (=Das lambda macht das ganze Komplizierter. Besser Explizit eine get und set Methode angeben.):
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class MyClass(object):
def __init__(self):
self._foo = None
def set_foo(self, val):
self._foo = val
def get_foo(self):
return self._foo
foo = property(fset=set_foo, fget=get_foo)
del set_foo
del get_foo
m = MyClass()
m.foo = 1, 2, 3, 4 # = (1,2,3,4) = 4er-Tuple != 4 Parameter
print m.foo #-> (1, 2, 3, 4)
Wie gesagt, das was der OP wollte geht nicht, sondern nur über den Umweg eines Containers (tuple, list, ...), was auch **Sinn** macht.