2014-07-18 13 views
5

Ho un po 'di problemi, e ho provato a fare ricerche su google, ma non risulta utile.Come si dispone di un attributo chiamato "proprietà" e si utilizza il decoratore @property?

Sto progettando un'applicazione django e voglio/devo avere un campo chiamato "proprietà". Il motivo per questo è che è il titolo tecnico della cosa che sto cercando di gestire e, ove possibile, vorrei mantenere la terminologia aziendale.

Ora questo non è stato un problema ... fino ad ora.

Ora ho bisogno di un metodo, che mi piacerebbe poter usare come una proprietà, ma c'è un po 'di contrasto tra l'uso del token property.

class DataElementConcept(trebleObject): 
    template = "polls/dataElementConcept.html" 
    objectClass = models.ForeignKey(ObjectClass,blank=True,null=True) 
    property = models.ForeignKey(Property,blank=True,null=True) 

    @property 
    def registryCascadeItems(self): 
     return [self.objectClass,self.property] 

Ho comprensibilmente ricevuto questo errore.

File "/home/theodore/Github/possum-mdr/polls/models.py", line 381, in DataElementConcept 
    @property 
TypeError: 'ForeignKey' object is not callable 

C'è un modo per aggirare questo che mi permette di trattare questo metodo come una proprietà, e mantenere l'attributo property?

risposta

7

Forse questo aiuta:

# On the module-level, do a workaround reference 
# as property() is just a normal built-in function 
_property = property 

class Foobar: 
    property = .... 


    @_property 
    def registryCascadeItems(self): 
     .... 
5

utilizzare il nome "fully-qualified" della proprietà incorporato:

import __builtin__ 

@__builtin__.property 
def registryCascadeItems(self): ... 

Certo, ho usato le citazioni intorno al termine "pienamente qualificato" perché questo non è un termine divinatorio. Non ci sono qualifiche di nome in python. Ciò che realmente è, è solo un altro punto in cui l'originale property è definito e accessibile.

IMHO, questo rende anche il codice più leggibile. Non c'è dubbio che tipo di proprietà è coinvolta - si fa riferimento esplicitamente a quello incorporato.

+0

(Sarà necessario importare il modulo [ '__builtin__'] (https://docs.python.org/2/library/__builtin__.html) per fare questo.) – user2357112