gpt4 book ai didi

python - 私有(private)属性和设置限制

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:02 25 4
gpt4 key购买 nike

所以对于我的代码,代码应该打印出两条语句,分别计算向量并将它们都写下来。以我的代码为例,程序应该打印出来

Vector: x=4, y=4
Vector: x=3, y=7

但是,我在使用私有(private)属性创建类时遇到了问题,并且限制 x 必须大于 3,y 不能大于 7。双下划线是否正确将其设为私有(private)?

class Vector:
def __init__(self):
self.__x = 4
self.__y =4


v1=Vector(4,4)
print(v1)
v2=Vector(v1.get_x()/2,v1.get_y()*2)
print(v2)

最佳答案

在 Python 中执行此操作的惯用方法是这样的:

class Vector:
def __init__(self, x, y):
self._x = x
self._y = y

@property
def x(self):
return self._x

@x.setter
def x(self, value):
if value < 3:
raise ValueError('x must be greater than 3')

self._x = value

@property
def y(self):
return self._y

@y.setter
def y(self, value):
if value > 7:
raise ValueError('y must be less than 7')

self._y = value

def __repr__(self):
return f'Vector(x = {self.x}, y = {self.y})'

v1 = Vector(4, 4)
print(v1)
v2 = Vector(v1.x / 2, v1.y * 2)
print(v2)

原始代码注释:

  • 单个下划线是“私有(private)”变量的典型标记。 Python 并没有真正的私有(private)变量,所以这纯粹是一种约定。任何阅读源代码的人都会知道他们可以访问 x 的底层值。喜欢v1._x .双下划线确实有意义,但它是为了不同的目的。参见 https://docs.python.org/3/tutorial/classes.html#private-variables了解更多详情。
  • get_foo惯用的方法。相反,您应该使用 @property装饰器(参见 https://docs.python.org/3/library/functions.html?highlight=property#property )。 @property让您自定义“属性访问”。
  • 您需要将一些输入传递给您的 __init__ .
  • print(v1) , 但由于您没有定义 __str____repr__ , 这只会打印类似 <__main__.Vector object at 0x0000019CA15D36A0> 的内容,这不是很有用。

关于python - 私有(private)属性和设置限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56606879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com