【问题标题】:@property applied to global (modul) function@property 应用于全局(模块)函数
【发布时间】:2017-08-24 12:22:54
【问题描述】:

在一些python模块中,有一些用property属性修饰的函数:

@property
def _Foo_bar(self):

上面的声明是什么意思?下划线“_”有什么含义吗?

【问题讨论】:

  • Python 教程(或用户手册)可能比在 StackOverflow 上提问更好。
  • @jochen 它没有说明将“@property”应用于任何类之外定义的函数

标签: python


【解决方案1】:

人们投反对票是因为您在发布问题之前似乎没有研究过问题。您可以在此处查看@property 装饰器的文档:python decorator docs

为了回答您的问题,@property 通常用于您的类属性。

# this should work in py2 and py3
class Foo:
    def __init__(self):
        self._a = None

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

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

if __name__ == "__main__":
    foo = Foo()
    foo.a = "some value"
    print(foo.a)

self._a 中的 _ 不对代码做任何事情,而是认为它是隐藏的。这意味着您“不应该”直接访问它们。你可以这样做,

foo._a = "some value" 

但是您随后绕过了代码的意图。也许您希望对该变量具有只读访问权限(上面的代码没有@a.setter 方法)。

【讨论】:

    【解决方案2】:

    属性是一个描述符对象。
    这是python docs的简要说明

    通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法覆盖。这些方法是 get()、set() 和 delete()。如果为对象定义了这些方法中的任何一个,则称其为描述符。

    属性访问的默认行为是从对象的字典中获取、设置或删除属性。例如,a.x 有一个查找链,以 a.dict['x'] 开始,然后是 type(a).dict['x'],并继续通过type(a) 的基类,不包括元类。如果查找的值是定义描述符方法之一的对象,则 Python 可能会覆盖默认行为并调用描述符方法。这在优先链中发生的位置取决于定义了哪些描述符方法。请注意,描述符仅对新样式对象或类调用(如果类继承自对象或类型,则该类是新样式)。

    简单地说,如果您想访问某个对象的属性但要运行一些代码,例如对于类型检查,您可以使用属性和传递(获取、设置、删除)函数来更改属性访问的默认行为。

    下划线通常用于表示私人属性。

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2019-05-23
      • 2020-04-23
      相关资源
      最近更新 更多