什么是使用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 – 有几个原因:
-
我们有内build函数,
setattr
和getattr
:setattr(object, 'property_name', value) getattr(object, 'property_name', default_value) # default is optional
-
我们有用于创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
-
虽然以上是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)
。