2013-06-09 5 views
2

У меня есть следующий кодметод Свойство без класса

global_variable = 1 

@property 
def method(): 
    # Some magic, for example 
    # incrementing global variable 
    global global_variable 
    global_variable += 1 
    return global_variable 

print method 

Этот код возврата

<property object at 0x28dedb8> 

Но я ожидаю 2. Можно ли в питона использовать свойство декоратора вне класса?

ответ

3

@properties предназначено быть экземпляром объектов недвижимости, определенных в классе. Например .:

class A(object): 
    @property 
    def a(self): 
     return 2 

b = A() 
b.a 
=> 2 

Если я понимаю, что вы пытаетесь определить модуль-свойство (или «глобальной» собственности). Там нет простого/чистого способа сделать это. См. this related question.

EDIT: вы также можете определить classproperty, чтобы сделать вашу собственность более глобально подобной (не требуется экземпляр). classproperty не является встроенным, но его легко определить. Вот один из способов определить это:

class classproperty(object): 
    def __init__(self, f): 
     self.f = classmethod(f) 
    def __get__(self, *a): 
     return self.f.__get__(*a)() 

Теперь вы можете сделать:

class A(object): 
    @classproperty 
    def a(self): 
     return 2 

A.a 
=> 2 
1

соблюдать следующий код: только

<property object at 0x7f892bfb11b0> 
<property object at 0x7f892bfb1208> 
2 

@property:

@property 
def f(): 
    return 1 

print f 

class a(object): 
    @property 
    def f(self): 
     return 2 

print a.f 
b = a() 
print b.f 

Выход правильно работает на объекте класса, который был en экземпляр.

Смежные вопросы