2012-10-21 30 views
7

Aşağıdaki sarmalayıcı sınıfını yazdım. __setattr__ tanımlamak istiyorum, tüm öznitelikleri sarılmış sınıfa yönlendiriyor. Ancak bu, sarmalayıcı sınıfını başlatmamı engelliyor. Bunu düzeltmenin herhangi bir yolu var mı?Başlatmadan sonra __setattr__ işlevini devre dışı bırakmak için yolu temizle

class Wrapper: 
    def __init__(self, value): 
     # How to use the default '__setattr__' inside '__init__'? 
     self.value = value 

    def __setattr__(self, name, value): 
     setattr(self.value, name, value) 
+0

'Wrapper' ne sarmak geliyor? Neden nesne 'miras almıyor? –

+0

@Tichodroma Bir şey sarar. Bir GUI uygulamasında kullanıyorum; Sarmalayıcı, kapalı nesne değiştirildiğinde, dinleyicilere bildirir. 'Object'den miras almıyor çünkü sadece Python 3'ü kullanmak istiyorum. –

cevap

8

Sen self.value atamalarını yapıcı engeller tüm atamaları, yakalıyoruz. Örnek sözlüğüne erişmek için self.__dict__'u kullanabilirsiniz. Deneyin: başka bir yolu object.__setattr__ kullanılarak

class Wrapper: 
    def __init__(self, value): 
     self.__dict__['value'] = value 

    def __setattr__(self, name, value): 
     setattr(self.value, name, value) 

:

class Wrapper(object): 
    def __init__(self, value): 
     object.__setattr__(self, 'value', value) 

    def __setattr__(self, name, value): 
     setattr(self.value, name, value) 
+0

Nice. Yine de bir soru: neden ben '__setattr__' içinde' self .__ dict __ ['value'] 'kullanmalıyım? –

+0

@Paul Üzgünüz, buna ihtiyacınız yok. Ben de '__getattr__' 'yi geçersiz kıldığını sanıyordum. – quantum

4

bir yol here kaplıdır __init__ yöntemde self.value = value sözdizimi değiştirmeden başlatma kadar sonra __setattr__ kaldırmak için. Kısaca, nesnedeki başlatma bilgisini gömün ve onu __setattr__ yönteminde kullanın. senin Wrapper için: __getattr__ ile

class Wrapper: 
    __initialized = False 
    def __init__(self, value): 
     self.value = value 
     self.__initialized = True 

    def __setattr__(self, name, value): 
     if self.__initialized: 
      # your __setattr__ implementation here 
     else: 
      object.__setattr__(self, name, value) 
0

yanı geçersiz ::

class Wrapper: 
    def __init__(self,wrapped): 
     self.__dict__['wrapped'] = wrapped 
    def __setattr__(self,name,value): 
     setattr(self.__dict__['wrapped'],name,value) 
    def __getattr__(self,name): 
     return getattr(self.__dict__['wrapped'],name) 


class A: 
    def __init__(self,a): 
     self.a = a 

wa = Wrapper(A(3)) 
#wa.a == wa.wrapped.a == 3 
İlgili konular