2012-07-31 15 views
17

İşlevleri üzerinde sık sık yinelenen bir desen var ve bu deseni bir dekoratöre dönüştürmek istedim. Fakat şu ki, bu dekoratörün mevcut örneğin bazı özelliklerine erişmesi gerekiyor, bu yüzden onu bu sınıftaki bir yönteme dönüştürmek istedim. Bununla bazı problemlerim var.Bir yöntem aynı sınıfın başka bir yönteminin bir dekoratör olabilir mi?

Yani, bu ne istiyorum benzer:

class DullRepetitiveClass: 
    def __init__(self, nicevariable): 
     self.nicevariable = nicevariable 

    def mydecorator(self, myfunction): 
     def call(*args, **kwargs): 
      print "Hi! The value of nicevariable is %s"%(self.nicevariable,) 
      return myfunction(*args, **kwargs) 
     return call 

    @mydecorator   #Here, comment (1) below. 
    def somemethod(self, x): 
     return x + 1 

(1) İşte sorundur. somemethod yöntemini süslemek için DullRepetitiveClass.mydecorator yöntemini kullanmak istiyorum. Ancak, şu anki örnekte dekoratör olarak yöntemi nasıl kullanacağım konusunda hiçbir fikrim yok.

Bunu yapmanın basit bir yolu var mı?

DÜZENLEME: Tamam, cevap oldukça açık. Sven'in aşağıda belirttiği gibi, dekoratörün kendisi de yöntemi değiştirir. Metodun kendisi ile ilgili her şeyi ele almalıdır:

+1

Lütfen girintinizi düzeltin. Ayrıca, kodunuzun herhangi bir sınıf yöntemi içermediğini unutmayın. –

+0

“Kendi” dışında bir * farklı * örneğini “sanallaştırıcı” nı 'somemethod' olarak dekore etmek için nasıl ileteceğinizi mi düşünüyorsunuz? – kojiro

+0

Oops. Vimden kopyalamak ve tarayıcıya yapıştırmak bazen bir acı olabilir ... –

cevap

11

Dekoratör yalnızca bir parametre alır - bu işlev ya da süslediği yöntem. Bir örnek, self parametresi olarak geçmez - dekoratör çağrıldığında, sınıf oluşturulmamış olsa bile, sınıfın bir örneğini bir yana bırakın. Örnek, dekore edilmiş işleve ilk bağımsız değişken olarak iletilecektir, bu yüzden call() parametre listesinde ilk parametre olarak self'u eklemelisiniz.

Dekoratörün sınıf kapsamına dahil edilmesinin gerekliliğini göremiyorum. Bunu yapabilirsiniz, ancak modül kapsamına da sahip olabilirsiniz.

+0

Lanet olsun, çok açık. Dekoratör, sadece yöntemi alır ve değiştirilmiş bir yöntem döndürür. Yöntem, örnekle uğraşması gereken adam ... kahrolası. Çok açık. –

+0

Dekoratörünüzün sınıf üyelerini kullanması gerekiyorsa ne olur? Yoksa bu sadece kötü bir fikir mi/desen mi? – aaronlevin

+0

@weirdcanada: Dekoratör çağrıldığında sınıf henüz oluşturulmadığından, üyelerine sıradan bir şekilde erişemezsiniz. Bu konuda çalışmak için bazı hackler yapabilirsiniz ('locals()' işlevini dekoratöre parametre olarak geçirme gibi), ancak bunlar oldukça açık değildir ve bunu yapmak için iyi bir neden düşünemiyorum. –

İlgili konular