【发布时间】:2018-01-26 11:12:53
【问题描述】:
在教程中,我看到了两种用于使用@property 的实例属性命名。这是显示两者示例的代码。它们的工作方式似乎也不同。
class A:
def __init__(self, x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x > 1000:
self.__x = 1000
else:
self.__x = x # Instance attribute __x defined outside __init__
class B:
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
@x.setter
def x(self, x):
if x > 1000:
self._x = 1000
else:
self._x = x
a = A(9999)
print(a.x) # -> 1000
b = B(9999) # -> 9999
print(b.x)
b.x = 9999
print(b.x) # -> 1000
我更喜欢 A 类的行为,因为似乎在 __init__ 中立即使用了 @x.setter,但是那段代码在 PyCharm 中给了我一个警告(我有它作为注释)。如果正确使用 Python 的属性设置器,为什么会有警告? B 类中没有警告。我能否以与 A 类中相同的方式在 __init__ 中调用 @x.setter 而没有警告?
【问题讨论】:
-
PyCharm 发出什么警告?显然,使用 setter 的代码(并因此利用了 setter)是优越的,是的。
-
旁注:setter 可以简化为
self._x = min(x, 1000)。 -
@MartijnPieters “实例属性
__x在__init__之外定义”,根据评论。 它是,OP,但这只是一个警告。 -
x的行为没有什么不同。您正在观察差异,因为在B.__init__中您设置的是_x而不是x -
顺便说一句:不要使用双下划线名称修饰,例如
self.__x除非您了解它是什么并且它是有效的用例。
标签: python class properties pycharm naming