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.