2009-12-16 35 views
8

Ben Python içinde mülkiyet ile uğraşıyorum ve bu @ propertyName.deleter dekoratör nasıl çalıştığını merak ediyorum. Muhtemelen bir şey kaçırıyorum, Google tarafından açık cevaplar bulamadım.delici dekoratör özelliğini kullanarak Python

Elde etmek istediğim, bu deleter davranışının çağrılmasıdır, diğer eylemleri tetikleyebilirim (örneğin: 3d uygulamasındaki SDK'yı kullanarak).

Şimdilik sadece basit bir baskı() tetiklenmiyor gibi görünüyor.

Ben del (instance.property)kullanarak tesisle sildiğinizde deleter ateş var mı?

Aksi halde bunu nasıl başarabilirim?

 

class M(): 

    def __init__(self): 
     self._m = None 

    @property 
    def mmm(self): 
     return self._m 

    @mmm.setter 
    def mmm(self, val): 
     self._m = val 

    @mmm.deleter 
    def mmm(self): 
     print('deleting') # Not printing 
     del(self._m) 




if __name__ == '__main__': 

    i = M() 
    i.mmm = 150 
    print(i.mmm) 
    del(i.mmm) 
    print(i.mmm) 

 

çok (teşekkürler:

cevap

9

bana M yeni tarzı sınıfını olun: Bkz

class M(object): 

http://www.python.org/download/releases/2.2.3/descrintro/#property:

Özellikleri klasik sınıflar için çalışmaz, ancak net bir almıyorsunuz Bunu denediğinizde hata. Sizin olsun yöntemi denir, yüzden çalışmak görünür, ancak nitelik atama üzerine, klasik bir sınıf örneği basitçe tesisin seti yöntemini çağırarak olmadan dict değerini belirleyecektir ve bundan sonra, edilecek property's get yöntemi, olarak adlandırılır. (Bunu düzeltmek için setattr geçersiz olabilir, ancak aşırı derecede pahalı olur.) Python 3

+0

değil açık bir hata Python 3'te aynı davranışı elde edersiniz, teşekkürler hızlı cevap için. – Xavier

6

Eğer print 'ın sonucunu görmek İSTİYORUM - ve son baskı için daha sonra bir AttributeError (_m çünkü kayboldu). Sen M yeni tarzı yapmak için size class M(object): için class maddesinin değiştirilmesine gerek bu durumda Python 2.6, kullanıyor olabilir ve daha sonra Nitekim

+0

Gerçekten Python 2.6 kullanıyorum. Zamanınız için teşekkürler Alex – Xavier

+1

@ Xavier, sizin için çok özel bir davranış, teşekkür et ve teşekkür et ve kabul et - ve ya cevaplar ya da ikisini de cevaplama! Bir cevabı (veya soruyu da) sevdiğin zaman, onu desteklemelisin - sistemi çalıştıran şey budur. –

+0

@Alex, bunu işaret ettiğin için teşekkürler (: - benim kötü. – Xavier

İlgili konular