2013-05-18 14 views
25

ben şöyle bir başka daha genel sınıf yöntemini kullanarak bazı sınıf yöntemlerini tanımlamak için çalışıyorum i bu yöntemlerden herhangi birini çağırmak istediğinizdefunctools.partial

class RGB(object): 
    def __init__(self, red, blue, green): 
     super(RGB, self).__init__() 
     self._red = red 
     self._blue = blue 
     self._green = green 

    def _color(self, type): 
     return getattr(self, type) 

    red = functools.partial(_color, type='_red') 
    blue = functools.partial(_color, type='_blue') 
    green = functools.partial(_color, type='_green') 

Ama olsun:

rgb = RGB(100, 192, 240) 
print rgb.red() 
TypeError: _color() takes exactly 2 arguments (1 given) 

rgb.red(rgb) çalışmalarından dolayı kendiliğinden _color'a geçilmiyor.

cevap

30

Yöntemi değil, işlevi bölümünde kısmi öğeler yaratıyorsunuz. functools.partial() nesneleri tanımlayıcı değildir, kendileri self bağımsız değişkenini eklemezler ve yöntemlerin kendileri gibi davranamazlar. yalnızca sargı yöntemlerini veya işlevlerini sarın, ilişkisiz yöntemlerle çalışmazlar. Bu documented geçerli:

partial nesneler çağrılabilir, zayıf referencable olmasıyla function nesneler gibidir ve özelliklerine sahip olabilir. Bazı önemli farklılıklar var. Örneğin, __name__ ve __doc__ öznitelikleri otomatik olarak oluşturulmaz. Ayrıca, sınıflarda tanımlanan partial nesneleri, statik yöntemler gibi davranır ve örnek niteliğinde arama sırasında bağlı yöntemlere dönüşmez.

Kullanım yerine property s; Burada yeni functools.partialmethod() object kullanabilirsiniz Python 3.4 itibariyle

class RGB(object): 
    def __init__(self, red, blue, green): 
     super(RGB, self).__init__() 
     self._red = red 
     self._blue = blue 
     self._green = green 

    def _color(self, type): 
     return getattr(self, type) 

    @property 
    def red(self): return self._color('_red') 
    @property 
    def blue(self): return self._color('_blue') 
    @property 
    def green(self): return self._color('_green') 

;: Bu tanımlayıcılarıdır bir örneğe bağımlı doğru olanı yapacağız:

class RGB(object): 
    def __init__(self, red, blue, green): 
     super(RGB, self).__init__() 
     self._red = red 
     self._blue = blue 
     self._green = green 

    def _color(self, type): 
     return getattr(self, type) 

    red = functools.partialmethod(_color, type='_red') 
    blue = functools.partialmethod(_color, type='_blue') 
    green = functools.partialmethod(_color, type='_green') 

ama property nesneler basit nitelikler olarak kullanılabilir iken, çağrılacak these'd var.

+0

Anladım. Teşekkürler. – Arjor

+1

'__init__' içinde' self.red = functools.partial (RGB._color, self, 'red') 'nedir? Python2 de uyumludur. – dashesy

+2

@dashesy: ​​elbette, ancak bu nesnelerin her bir örneğe (bir bellek maliyeti) koyar, ayrıca bir alt sınıfın yerini almasını zorlaştırır. –