2011-07-06 42 views
1

我认为这个概念称为重载。 现在我正在写一个提供getter和setter方法的类,并且陷入了设计问题。python中的“方法重载”

这两种方法都是简单设置一个值或返回一个值的单行程序。

 
def set_number(self, num): 

    self.count = num 

def get_number(self): 

    return self.count 

它会更好,以节省空间,使课堂“看”,由做的事情基本上都会两种方法结合成一个,然后就决定应执行该线取决于NUM参数是否为小提供?

或者我应该坚持清晰,并保持它们分开?有些人认为,让所有这些单线自行保留是一种“浪费空间”,而另一些人却不同意,宁愿将其分开。

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

+4

使用'@ property'来做一些超载。它会为你简化这一切,并消除所有的手动。 –

回答

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。 =)

额外奖金的阅读材料:

+0

哦,这很酷。如果以后我真的需要这个,我可以添加setter。 – MxyL

+0

通读关于tomayko的文章,并在评论中,似乎有几个原因,它不是最好的选择,但我不知道他们是否指的是同样的事情。 – MxyL

+0

@Keikoku:照顾细节?我所看到的只是非主观的言论,起源于不恰当地阅读文章,或者在后面的评论中被驱散。 – delnan

-1

我会离开它作为代码readabilty和maintainabilty着想两种不同的方法。

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.

+0

这是“压倒一切”。重载意味着具有相同名称但签名不同的两种方法。你在Python中无法真正做到这一点。 – FogleBird

+0

@FogleBird;杜,你说得对。我把它弄混了。尽管你可以通过'__cmp__'等来做一些重载。 – Daenyth

+0

@FogleBird:当然,你不需要,因为你可以使用'(* args,** kwargs)',然后根据你传递的参数/多少参数来表现不同。 – geoffspear