我认为这个概念叫做重载。 现在我正在编写一个提供getter和setter方法的类,并且遇到了设计问题。
这两种方法都是单行,只需设置一个值,或返回一个值。
def set_number(self, num): self.count = num def get_number(self): return self.count
通过做一些基本上将两个方法合并为一个然后根据是否提供num参数来决定应该执行哪一行来节省空间并使类“看起来更小”会更好吗?
或者我应该坚持清晰并将它们分开?有些人认为将所有这些单线保留在自己身上是“浪费空间”,而其他人不同意并且更愿意将它们分开。
为什么我会选择其中一个?
答案 0 :(得分:10)
在Python中,你根本不应该使用getter和setter。而是直接引用count
属性,例如print instance.count
或instance.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.
答案 2 :(得分:-1)
为了代码的可读性和可维护性,我会把它作为两个单独的方法。