Python属性返回属性对象

gcq*_*gcq 6 python python-2.7

我有一个这样的课:

class Foo(object):
    def __init__(self):
        self.bar = property(self.get_bar)

    def get_bar(self):
        return "bar"

print Foo().bar  #this prints <property object at 0x0051CB40>
Run Code Online (Sandbox Code Playgroud)

我已经看过Python属性如何工作?,如何在__init__中设置python属性,但它们都使用装饰器方法,我没有,因为我想要一个不同的名称.我需要访问self

我如何让财产表现出来?

use*_*963 9

该对象未实例化。

class Foo(object):
  def get_bar(self):
    return "bar"

bar = Foo()
print(bar.get_bar)
Run Code Online (Sandbox Code Playgroud)


jon*_*rpe 8

你需要做一个小改动:

class Foo(object):

    def get_bar(self):
        return "bar"

    bar = property(get_bar)

print Foo().bar # prints bar
Run Code Online (Sandbox Code Playgroud)

属性需要是类的属性,而不是实例; 这就是描述符协议的工作原理.

  • @EL_DON,因为该属性需要是* class *的属性,而不是* instance *的属性;这就是[descriptor](https://docs.python.org/3/howto/descriptor.html)协议的工作方式。 (2认同)

ber*_*111 7

您也可以按照此处所示进行操作:

class Foo(object):
    def __init__(self):
        self._bar = None

    @property
    def bar(self):
        return self._bar

    @bar.setter
    def bar(self, value):
        self._bar = value

    @bar.deleter
    def bar(self):
        self._bar = None # for instance
Run Code Online (Sandbox Code Playgroud)

这相当于:

class Also_Foo(object):
    def __init__(self):
        self._bar = None

    def get_bar(self):
        return self._bar

    def set_bar(self, value):
        self._bar = value

    def del_bar(self):
        self._bar = None # for instance

    bar = property(fget=get_bar, fset=set_bar, fdel=del_bar, doc=None)
Run Code Online (Sandbox Code Playgroud)

get不会用每个属性的方法污染类名称空间set

._bar您可以使用而不是保留对变量的外部直接访问.bar


the*_*eye 5

你可以这样做

class Foo(object):
    def __init__(self):
        self.__bar = None

    def get_bar(self):
        return self.__bar

    def set_bar(self, value):
        self.__bar = value

    bar = property(get_bar, set_bar)

foo = Foo()
print foo.bar    # None
foo.bar = 1
print foo.bar    # 1
Run Code Online (Sandbox Code Playgroud)