«Перегрузка метода» в питоне - PullRequest
1 голос
/ 06 июля 2011

Я думаю, что концепция называется перегрузкой. Сейчас я пишу класс, который будет предоставлять методы получения и установки, и застрял в проблеме проектирования.

Оба метода являются однострочными, которые просто устанавливают значение или возвращают значение.

def set_number(self, num):

   self.count = num

def get_number(self):

   return self.count

Было бы лучше сэкономить место и сделать класс "выглядящим" меньше, выполнив что-то, что в основном объединит два метода в один, а затем просто решит, какую строку следует выполнить, в зависимости от того, указан ли аргумент num?

Или я должен просто придерживаться ясности и держать их разделенными? Некоторые люди чувствуют, что все эти однострочники - это «пустая трата пространства», в то время как другие не соглашаются и предпочитают разделять их.

Какие-либо причины, по которым я бы выбрал одну или другую?

Ответы [ 3 ]

10 голосов
/ 06 июля 2011

В Python вы не должны использовать геттеры и сеттеры вообще. Вместо этого просто обратитесь непосредственно к атрибуту count, например, print instance.count или instance.count = 5

Точка получения и установки на других языках предназначена для инкапсуляции и для защиты на будущее в случае, если вам нужно добавить логику к получателям или установщикам. В Python вы можете сделать это позже, используя property, что не нарушит ваш существующий API.

@property
def number(self):
     # do extra logic if necessary
    return self.count

Свойства также могут иметь сеттеры - см .: http://docs.python.org/library/functions.html#property

Python не является Java. =)

Дополнительные материалы для чтения бонусов:

2 голосов
/ 06 июля 2011

Обычно в python очень плохой стиль - использовать явные методы получения / установки.Просто сделайте что-то вроде этого:

In [1]: class Foo(object):
   ...:     def __init__(self):
   ...:         self.num = 1
   ...:         
   ...:         
In [2]: f = Foo()
In [3]: f.num
Out[3]: 1
In [4]: f.num = 2
In [5]: f.num
Out[5]: 2

Если вам действительно нужна логика, вы можете сохранить этот же API позже, используя properties .Обратите внимание, как тот же интерфейс сохраняется ниже при добавлении функциональности.

In [8]: class Foo(object):
   ...:     def __init__(self):
   ...:         self._num = 1
   ...:     @property
   ...:     def num(self):
   ...:         return self._num
   ...:     @num.setter
   ...:     def num(self, num):
   ...:         if num < 0:
   ...:             raise ValueError("Your Foo would be too small!")
   ...:         self._num = num
   ...:         
   ...:         
In [10]: f = Foo()
In [11]: f.num
Out[11]: 1
In [12]: f.num = 2
In [13]: f.num
Out[13]: 2
In [14]: f.num = -1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/Daenyth/<ipython console> in <module>()

/home/Daenyth/<ipython console> in num(self, num)

ValueError: Your Foo would be too small!

Относительно «перегрузки» - этот термин здесь не применяется.Это термин для изменения поведения таких операторов, как +, == и т. Д., Путем изменения определения этих методов для вашего объекта.Вы можете выполнить некоторую перегрузку в python через __cmp__, __add__ и т. Д.

0 голосов
/ 06 июля 2011

Я бы оставил это как два отдельных метода ради читабельности и поддержки кода.

...