python - functools.partial على طريقة الفصل




1 Answers

أنت تقوم بإنشاء أجزاء جزئية على الوظيفة ، وليس الطريقة. كائنات functools.partial() ليست واصفات ، فإنها لن تقوم بنفسها بإضافة حجة self ولا يمكنها أن تعمل functools.partial() بنفسها. يمكنك فقط التفاف الأساليب أو الوظائف المقيد ، فإنها لا تعمل على الإطلاق بأساليب غير محدودة. هذا documented :

الكائنات partial تشبه الكائنات function في أنها قابلة للاستدعاء ، ضعيفة مرجعية ، ويمكن أن يكون لها سمات. هناك بعض الاختلافات المهمة. على سبيل المثال ، لا يتم إنشاء سمات __doc__ و __doc__ تلقائيًا. أيضًا ، تتصرف الكائنات partial المحددة في الفئات مثل الأساليب الثابتة ولا تتحول إلى طرق مُحددة أثناء البحث عن السمة المثيل.

استخدم property s بدلاً من ذلك ؛ هذه هي الواصفات:

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')

اعتبارًا من Python 3.4 ، يمكنك استخدام كائن functools.partialmethod() الجديد هنا ؛ انها سوف تفعل الشيء الصحيح عندما تكون ملزمة لمثيل:

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')

ولكن يجب أن يتم الاتصال بها ، في حين يمكن استخدام كائنات property كسمات بسيطة.

أحاول تعريف بعض أساليب الفصل باستخدام طريقة أخرى لفئة أكثر عمومية كما يلي:

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')

ولكن عندما أحاول استحضار أي من تلك الطرق التي أحصل عليها:

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

أعتقد لا يتم تمرير النفس إلى _color منذ rgb.red(rgb) .




Related

python exception methods functools