猿问

房地产设计师是如何工作的?

房地产设计师是如何工作的?

我想了解内置功能是如何实现的。property起作用了。让我困惑的是property也可以作为装饰器使用,但它只在作为内置函数使用时才会使用参数,而不是作为装饰器使用时才会使用参数。

此示例来自文献资料:

class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x    def setx(self, value):
        self._x = value    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

property其论点是getxsetxdelx还有一根医生线。

在下面的代码中property被用作装饰师。它的对象是x函数,但在上面的代码中,参数中没有对象函数的位置。

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x    @x.setter    def x(self, value):
        self._x = value    @x.deleter    def x(self):
        del self._x

还有,你觉得x.setterx.deleter装饰师创造的?我很困惑。


狐的传说
浏览 592回答 4
4回答

江户川乱折腾

这个property()函数返回一个特殊的描述符对象:>>>&nbsp;property()<property&nbsp;object&nbsp;at&nbsp;0x10ff07940>正是这个对象额外方法:>>>&nbsp;property().getter<built-in&nbsp;method&nbsp;getter&nbsp;of&nbsp;property&nbsp;object&nbsp;at&nbsp;0x10ff07998 >>>>&nbsp;property().setter<built-in&nbsp;method&nbsp;setter&nbsp;of&nbsp;property&nbsp;object&nbsp;at&nbsp;0x10ff07940 >>>>&nbsp;property().deleter<built-in&nbsp;method&nbsp;deleter&nbsp;of&nbsp;property&nbsp;object&nbsp;at&nbsp;0x10ff07998>这些人充当装潢工。也是..它们返回一个新的属性对象:>>>&nbsp;property().getter(None)<property&nbsp;object&nbsp;at&nbsp;0x10ff079f0>这是旧对象的副本,但是替换了其中一个函数。记住,@decorator语法只是语法糖;语法:@propertydef&nbsp;foo(self):&nbsp;return&nbsp;self._foo真的意味着同样的事情def&nbsp;foo(self):&nbsp;return&nbsp;self._foo foo&nbsp;=&nbsp;property(foo)所以foo该函数被替换为property(foo)我们在上面看到的是一个特殊的物体。然后当你用@foo.setter(),你要做的就是叫它property().setter方法,它返回属性的一个新副本,但这次用setter函数替换为修饰方法。下面的序列还通过使用这些装饰器方法创建了一个完整的属性。首先,我们创建一些函数和一个property对象,只需一个getter:>>>&nbsp;def&nbsp;getter(self):&nbsp;print&nbsp;'Get!'...&nbsp;>>>&nbsp;def&nbsp;setter(self,&nbsp;value):&nbsp;print&nbsp;'Set&nbsp;to&nbsp;{!r}!'.format(value)...&nbsp;>>> &nbsp;def&nbsp;deleter(self):&nbsp;print&nbsp;'Delete!'...&nbsp;>>>&nbsp;prop&nbsp;=&nbsp;property(getter)>>>&nbsp;prop.fget&nbsp;is&nbsp;getterTrue>>>&nbsp;prop.fset&nbsp;is&nbsp;NoneTrue &nbsp;>>>&nbsp;prop.fdel&nbsp;is&nbsp;NoneTrue接下来,我们使用.setter()方法添加一个setter:>>>&nbsp;prop&nbsp;=&nbsp;prop.setter(setter)>>>&nbsp;prop.fget&nbsp;is&nbsp;getterTrue>>>&nbsp;prop.fset&nbsp;is&nbsp;setterTrue>>>&nbsp;prop.fdel&nbsp;is&nbsp;NoneTrue最后,我们使用.deleter()方法:>>>&nbsp;prop&nbsp;=&nbsp;prop.deleter(deleter)>>>&nbsp;prop.fget&nbsp;is&nbsp;getterTrue>>>&nbsp;prop.fset&nbsp;is&nbsp;setterTrue>>>&nbsp;prop.fdel&nbsp;is&nbsp;deleterTrue最后但并非最不重要的是,property对象充当描述符对象,所以.__get__(),&nbsp;.__set__()和.__delete__()方法连接到实例属性获取、设置和删除:>>>&nbsp;class&nbsp;Foo(object):&nbsp;pass...&nbsp;>>>&nbsp;prop.__get__(Foo(),&nbsp;Foo)Get!>>>&nbsp;prop.__set__(Foo(),&nbsp;'bar')Set&nbsp;to&nbsp;'bar'!>>>&nbsp;prop.__delete__(Foo())Delete!描述符howto包括纯python示例实现.的.property()类型:class&nbsp;Property(object): &nbsp;&nbsp;&nbsp;&nbsp;"Emulate&nbsp;PyProperty_Type()&nbsp;in&nbsp;Objects/descrobject.c" &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;fget=None,&nbsp;fset=None,&nbsp;fdel=None,&nbsp;doc=None): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fget&nbsp;=&nbsp;fget &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fset&nbsp;=&nbsp;fset &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fdel&nbsp;=&nbsp;fdel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;doc&nbsp;is&nbsp;None&nbsp;and&nbsp;fget&nbsp;is&nbsp;not&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;=&nbsp;fget.__doc__ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__doc__&nbsp;=&nbsp;doc&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__get__(self,&nbsp;obj,&nbsp;objtype=None): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;obj&nbsp;is&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.fget&nbsp;is&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;AttributeError("unreadable&nbsp;attribute") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.fget(obj) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__set__(self,&nbsp;obj,&nbsp;value): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.fset&nbsp;is&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;AttributeError("can't&nbsp;set&nbsp;attribute") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fset(obj,&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__delete__(self,&nbsp;obj): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.fdel&nbsp;is&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;AttributeError("can't&nbsp;delete&nbsp;attribute") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fdel(obj) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getter(self,&nbsp;fget): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type(self)(fget,&nbsp;self.fset,&nbsp;self.fdel,&nbsp;self.__doc__) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;setter(self,&nbsp;fset): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type(self)(self.fget,&nbsp;fset,&nbsp;self.fdel,&nbsp;self.__doc__) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;deleter(self,&nbsp;fdel): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type(self)(self.fget,&nbsp;self.fset,&nbsp;fdel,&nbsp;self.__doc__)

慕侠2389804

下面是一个很小的例子@property可执行:class&nbsp;Thing: &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;my_word): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._word&nbsp;=&nbsp;my_word&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;@property &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;word(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self._word>>>&nbsp;print(&nbsp;Thing('ok').word&nbsp;)'ok'不然的话word保留方法而不是属性。class&nbsp;Thing: &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;my_word): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._word&nbsp;=&nbsp;my_word&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;word(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self._word>>>&nbsp;print(&nbsp;Thing('ok').word()&nbsp;)'ok'

拉丁的传说

第一部分很简单:@propertydef&nbsp;x(self):&nbsp;...是相同的def&nbsp;x(self):&nbsp;...x&nbsp;=&nbsp;property(x)而这反过来又是创建property只需要一个吸气器。下一步是使用setter和删除器扩展此属性。这种情况发生在适当的方法上:@x.setterdef&nbsp;x(self,&nbsp;value):&nbsp;...返回继承旧属性中所有内容的新属性。x加上给定的策划人。x.deleter同样的工作方式。
随时随地看视频慕课网APP

相关分类

Python
我要回答