Ответ 1
Вы создаете частичные функции, а не метод. functools.partial()
объекты не являются дескрипторами, они сами не будут добавлять аргумент self
и не могут действовать как сами методы. Вы можете только обернуть связанные методы или функции, они вообще не работают с несвязанными методами. Это документировано:
partial
объекты похожи на объектыfunction
, поскольку они являются вызываемыми, слабыми ссылочными и могут иметь атрибуты. Есть некоторые важные отличия. Например, атрибуты__name__
и__doc__
не создаются автоматически. Кроме того,partial
объекты, определенные в классах, ведут себя как статические методы и не преобразуются в связанные методы при просмотре атрибутов экземпляра.
Используйте 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)
@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
могут использоваться как простые атрибуты.