【问题标题】:How to pass setter property as argument to a function?如何将 setter 属性作为参数传递给函数?
【发布时间】:2018-04-02 03:52:26
【问题描述】:

我正在尝试将 setter 属性作为参数传递给函数。 我的班级有以下属性。

@property
def drawMode(self):
    return self._drawMode

@drawMode.setter
def drawMode(self, value):
    self._drawMode = value

我可以将 getter 作为参数传递给函数,如下所示:

rectItem = CustGraphicsRectItem(rect, self.drawMode)

传递setter的语法是什么?

【问题讨论】:

  • 您打算将哪种对象传递给函数?您希望传递 setter 的代码如何与它交互?您用来“传递 getter”的 self.drawMode 实际上是传递属性存储的当前值。它没有传递函数或属性对象。设置值没有明显的等价物(也许您应该调用一些返回值的东西,您自己分配给self.drawMode)。

标签: python function properties


【解决方案1】:

如果您将属性的 name 传递给函数(连同对象本身),您可以执行类似的操作。这允许从对象的类中检索属性对象。获取到之后,就可以直接调用它的__set__()了。

class Test:
    def __init__(self):
        self._drawMode = None

    def foobar(self):
        pass

    @property
    def drawMode(self):
        return self._drawMode

    @drawMode.setter
    def drawMode(self, value):
        self._drawMode = value


def CustGraphicsRectItem(rect, obj, prop_name):
    obj_type = type(obj)
    if prop_name not in obj_type.__dict__:
        raise TypeError('{!r} is not an attribute of class {}'.format(
                            prop_name, obj_type.__name__))
    else:
        prop = obj_type.__dict__[prop_name]
        if not isinstance(prop, property):
            raise TypeError('{!r} is not an property of class {}'.format(
                                prop_name, obj_type.__name__))

    prop.__set__(obj, 42)  # Set property's value via direct call to setter.
    return rect

test = Test()
rect = [0, 0, 10, 20]
print(test.drawMode)  # -> None
rectItem = CustGraphicsRectItem(rect, test, 'drawMode')
print(test.drawMode)  # -< 42

【讨论】:

    【解决方案2】:

    您可以直接传递属性对象并避免使用魔术字符串。您仍然需要传递实例:

    class Class:
        def __init__( self ):
            self.__value = "old value"
    
    
        @property
        def value( self ):
            return self.__value
    
    
        @value.setter
        def value( self, value ):
            self.__value = value
    
    
    def function( instance, property_ ):
        print( property_.fget( instance ) )
        property_.fset( instance, "new value" )
        print( property_.fget( instance ) )
    
    
    instance = Class()
    function( instance, Class.value )
    

    输出:

    old value
    new value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      相关资源
      最近更新 更多