2012-02-07 20 views
6

Genel Bakış: - o ayarlanmış tüm özelliklerini aynı, o.inner üzerinde ayarlanması gerekir Şimdiİçiçe nesneler ve setattr & getattr (evet, öyle o zaman)

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object): 
    def __init__(self, z): 
     self.inner = Inner(z) 

o = Outer(10) 

, ben Dış nesne şeffaf davranmasını istiyorum Okuma: o.something, aslında, o.inner.sommething değerini döndürmelidir. Bir vekil veya röle gibi.

def __getattr__(self, item): 
    return getattr(self, item) 

nasıl __setattr__ işlemek olacaktır: Outer için

__getattr__ basit & eser görünüyor? Tekrarlama hatasına neden olmayan ve kendimden nefret etmeyen bir şey bulamadım.

Veya konseptin kendisi kusurlu mu? Bu gerçekten IDE olanlar içeride kaybolmak istiyorum saymıyorum, estetik mevcut @classmethods oynamadı - -

(denedim başka bir yaklaşım Outer Inner bir alt sınıfı yapıyordu. Bazı özelliklerini çözümleyemiyorsa en bırakalım Şimdilik, belki de?)

+0

Bunu mu demek istediniz: self.inner = Inner (z) '? Ayrıca, getattr yönteminiz Inner() 'dan veri döndürüyor mu? Yazılma şekli, sadece Outer'e gönderme yapar gibi görünüyor. – gfortune

+0

Evet - geri dönüyor. Hem sabit, teşekkürler! – ntl0ve

cevap

7

Zor kısmı, Outer sınıfının inner özniteliğini doğru şekilde ayarlıyor. Ne yapabilirsiniz (Outer taban sınıfı) object ait __setattribute__ yöntemini çağırır: Şimdi

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object):  
    def __init__(self, z): 
     object.__setattr__(self, 'inner', Inner(z)) 

    def __getattr__(self, name): 
     return getattr(self.inner, name) 

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

, doğru çalışır: Ancak

o = Outer(10) 
print o.x  # 10 
print o.inner.x # 10 
o.g = 3 
print o.g  # 3 
print o.inner.g # 3 

, bu kadar net değil benim değil mi neden Bu durumda miras kullanmak istiyorum. Inner'dan Outer numaralı ürüne sahip olmak daha doğal ve pythonik görünmektedir.

+0

Ve yazdırma (o.inner) çalışmasının nedeni, o.inner zaten var çünkü '__getattr__' diye bir çağrı yapmıyor ve o.inner.inner'ı döndürmeye çalışıyor, doğru mu? İstenen öğenin söz konusu nesnenin bir parçası olarak zaten var olduğu durumlarda __getattr__'nin çağrılmadığı açık değildir. – gfortune

+0

@gfortune, yes; daha fazla bilgi için [bu soru] bölümüne bakın (http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python). – senderle

+0

evet, bkz. [\ _ \ _ Getattr \ _ \ _] (http://docs.python.org/reference/datamodel.html#object.__getattr__) dokümanlar – jterrace