Python属性返回属性对象

Python property returning property object

我有一个这样的班级:

1
2
3
4
5
6
7
8
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>

我已经看到了Python属性是如何工作的?,如何在uuinit_uuuuu中设置python属性,但它们都使用decorator方法,这不是因为我需要不同的名称。我需要访问EDOCX1[0]

我怎样才能让房产正常运转?


你需要做一个小小的改变:

1
2
3
4
5
6
7
8
class Foo(object):

    def get_bar(self):
        return"bar"

    bar = property(get_bar)

print Foo().bar # prints bar

属性必须是类的属性,而不是实例;这就是描述符协议的工作方式。


你可以这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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


您也可以这样做,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

相当于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

但不会对每个属性使用getset方法污染类命名空间。

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


对象未实例化。

1
2
3
4
5
6
7
class Foo(object):

def get_bar(self):
    return"bar"

bar = Foo()
print(bar.get_bar)