2014-02-16 3 views
4

У меня есть класс, как это:Python свойство объекта возвращения собственности

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

Как я могу заставить собственность вести себя?

+2

Почему вы хотите использовать другое имя? Есть ли разумная причина? –

+0

Вы пытались использовать свойство в качестве декоратора или докшлинга? –

+0

Быстрое решение будет заключаться в явном вызове '__get__' на' bar': 'f = Foo(); f.bar .__ get __ (f, type (f))' –

ответ

4

Вам необходимо внести небольшие изменения:

class Foo(object): 

    def get_bar(self): 
     return "bar" 

    bar = property(get_bar) 

print Foo().bar # prints bar 
+0

get_bar не определен. Idk, что я делаю неправильно – gcq

+0

Я определял свойство перед функцией. Все в порядке. – gcq

+0

@gcq Теперь попробуйте установить значение 'bar'. – thefourtheye

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 
0

Вы также можете сделать это, как показанный 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) 

BUT без загрязнения пространства имен классов с помощью методов get и set для каждого атрибута.

Вы сохраняете внешний прямой доступ к переменной с помощью ._bar вместо .bar.

-1

Объект не создан.

class Foo(object): 

def get_bar(self): 
    return "bar" 

bar = Foo() 
print(bar.get_bar) 
Смежные вопросы