什么是使用getter和setter的pythonic方法?

我是这样做的:

def set_property(property,value): def get_property(property): 

要么

 object.property = value value = object.property 

我是Python的新手,所以我仍然在探索这个语法,而且我希望得到一些build议。

Pythonic的方式是不使用它们。 如果你必须有他们,然后把他们藏在一个财产。

试试这个: Python属性

示例代码是:

 class C(object): def __init__(self): self._x = None @property def x(self): """I'm the 'x' property.""" print("getter of x called") return self._x @x.setter def x(self, value): print("setter of x called") self._x = value @x.deleter def x(self): print("deleter of x called") del self._x 

什么是使用getter和setter的pythonic方法?

 def set_property(property,value): def get_property(property): 

要么

 object.property = value value = object.property 

第二个例子是Pythonic(见下面第3点的资格)。 第一个例子是非Pythonic – 有几个原因:

  1. 我们有内build函数, setattrgetattr

     setattr(object, 'property_name', value) getattr(object, 'property_name', default_value) # default is optional 
  2. 我们有用于创buildgetter和setter的@property修饰器,它们是这样创build的:

     class Protective(object): @property def protected_value(self): return self._protected_value @protected_value.setter def protected_value(self, value): if acceptable(value): # eg type or range check self._protected_value = value 
  3. 虽然以上是Pythonic保护属性的方法,但总的来说,我们希望避免使用property ,只使用直接属性。 假设这就是你在第二个例子中的意思,让我们把元variables名称从property改为attribute

     object.attribute = value value = object.attribute 

    一般来说,这是Python的用户所期望的。 遵循最less的惊喜规则,除非你有一个非常有说服力的理由,否则你应该尽力给你的用户他们的期望。

示范

例如,假设我们需要我们的对象的protected属性是一个0到100之间的整数:

 class Protective(object): def __init__(self, start_protected_value=0): self.protected_value = start_protected_value @property def protected_value(self): return self._protected_value @protected_value.setter def protected_value(self, value): if isinstance(value, int) or (isinstance(value, float) and value.is_integer()): if 0 <= value <= 100: self._protected_value = int(value) else: raise ValueError("protected_value must be " + "between 0 and 100 inclusive") else: raise TypeError("protected_value must be an integer") 

和用法:

 >>> p1 = Protective(3) >>> p1.protected_value 3 >>> p1 = Protective(5.0) >>> p1.protected_value 5 >>> p2 = Protective(-5) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in __init__ File "<stdin>", line 15, in protected_value ValueError: protectected_value must be between 0 and 100 inclusive >>> p1.protected_value = 7.3 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 17, in protected_value TypeError: protected_value must be an integer >>> p1.protected_value = 101 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 15, in protected_value ValueError: protectected_value must be between 0 and 100 inclusive 

看看@property装饰器 。

 In [1]: class test(object): def __init__(self): self.pants = 'pants' @property def p(self): return self.pants @p.setter def p(self, value): self.pants = value * 2 ....: In [2]: t = test() In [3]: tp Out[3]: 'pants' In [4]: tp = 10 In [5]: tp Out[5]: 20 

定义__setattr__(self, name, value)和/或__getattr__(self, name)