python中的“方法重载”

时间:2011-07-06 15:19:47

标签: python overloading

我认为这个概念叫做重载。 现在我正在编写一个提供getter和setter方法的类,并且遇到了设计问题。

这两种方法都是单行,只需设置一个值,或返回一个值。

def set_number(self, num):

   self.count = num

def get_number(self):

   return self.count

通过做一些基本上将两个方法合并为一个然后根据是否提供num参数来决定应该执行哪一行来节省空间并使类“看起来更小”会更好吗?

或者我应该坚持清晰并将它们分开?有些人认为将所有这些单线保留在自己身上是“浪费空间”,而其他人不同意并且更愿意将它们分开。

为什么我会选择其中一个?

3 个答案:

答案 0 :(得分:10)

在Python中,你根本不应该使用getter和setter。而是直接引用count属性,例如print instance.countinstance.count = 5

其他语言中的getter和setter的意义在于封装和未来验证,以防您需要向getter或setter添加逻辑。在Python中,您可以稍后使用property来完成此操作,这不会破坏您现有的API。

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

属性也可以有setter - 请参阅:http://docs.python.org/library/functions.html#property

Python不是Java。 =)

额外奖金阅读材料:

答案 1 :(得分:2)

通常在python中使用显式getter / setter方法非常糟糕。做这样的事情:

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

如果您确实需要逻辑,则可以使用properties在以后保留此相同的API。请注意,在添加功能的同时,如何在下面保留相同的界面。

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!

关于“重载” - 该术语不适用于此处。这是通过更改对象上这些方法的定义来更改+==等运算符的行为的术语。你可以通过__cmp__, __add__, and so on.

在python中做一些重载

答案 2 :(得分:-1)

为了代码的可读性和可维护性,我会把它作为两个单独的方法。