Python属性返回属性对象

时间:2014-02-16 13:54:44

标签: 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>

我见过How do Python properties work?How to set a python property in __init__,但他们都使用装饰器方法,我没有,因为我想要一个不同的名字。我需要访问self

我如何让财产表现出来?

5 个答案:

答案 0 :(得分:6)

你需要做一个小改动:

class Foo(object):

    def get_bar(self):
        return "bar"

    bar = property(get_bar)

print Foo().bar # prints bar

属性需要是类的属性,而不是实例;这就是descriptor协议的工作原理。

答案 1 :(得分: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

答案 2 :(得分:2)

你也可以像显示here

那样做
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

相当于:

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保留对变量的外部直接访问权限。

答案 3 :(得分:0)

我的用例要求仅在某些条件下将 bar 定义为属性,因此我采纳了 jonrsharpe 的建议并将定义移至 __new__

class Foo(object):
    def __new__(cls):
        cls.bar = property(cls.get_bar)
        return super(Foo, cls).__new__(cls)

    def get_bar(self):
        return "bar"

print(Foo().bar)  #this prints "bar"

然而,这种“聪明”并没有得到任何好处。一旦满足条件,该类就包含该属性。我也可以像 jonrsharpe 那样定义它。

答案 4 :(得分:-2)

对象未实例化。

var names = ['Bryan', 'Jeremy', 'Joe', 'Megan', 'Ian', 'Taylor'],
    first = names.find(_ => true);

console.log(first);