gpt4 book ai didi

Python - @property 和 __init__() 中的设置有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:09 25 4
gpt4 key购买 nike

无法从其他主题中得到直接的答案:

在 Python 中,using 和 using 的主要区别是什么

class Foo(object):
def __init__(self, x):
self.x = x

class Foo(object):
def __init__(self, x):
self._x = x

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

从外观上看,以这种方式使用@property 会使 x 成为只读的。但也许有人有更好的答案?谢谢/弗雷德

最佳答案

property 装饰器实现使用 descriptor protocol ,这就是我们在 Python OOP 中进行数据封装的方式。描述符是:

In general, a descriptor is an object attribute with “bindingbehavior”, one whose attribute access has been overridden by methodsin the descriptor protocol. Those methods are __get__(), __set__(),and __delete__(). If any of those methods are defined for an object,it is said to be a descriptor.

通常,在其他 OOP 语言中,您使用 getter 和 setter。你会经常看到来自 Java 的人编写这样的 Python 类:

class A(object):
def __init__(self, x, y):
self._x = x
self._y = y
def getX(self):
return self._x
def getY(self):
return self._y
def setX(self, x):
self._x = x
def setY(self, y):
self._y = y
def some_method_that_uses_attributes(self):
return self.getX() + self.getY()

这非常不是您在 Python 中做事的方式。 getter 和 setter 的作用是提供数据封装。我们通过将数据属性包装在 getter 和 setter 中来封装对数据属性的访问。然后,如果我们想添加一些东西,比如说,确保 x 永远不会设置为低于 10 的值(作为一个人为的示例),我们只需更改 setX 的方式已实现,我们不必修改其余代码。然而,在 Python 中,我们将按如下方式编写上述类:

class A(object):
def __init__(self, x, y):
self.x = x
self.y = y
def some_method_that_uses_attributes(self):
return self.x + self.y

来自 Java 的人可能会惊恐地退缩:“你没有正确封装你的类!这将成为维护的噩梦!”

不,因为我们有描述符/属性:

class A(object):
def __init__(self, x, y):
self._x = x
self.y = y
@property
def x(self):
return self._x
@x.setter
def x(self, val):
if val > 10:
self._x = val
else:
raise ValueError("x must be greater than 10")
def some_method_that_uses_attributes(self):
return self.x + self.y

现在,我们不必重构每个使用 self.x 的方法,例如 some_method_that_uses_attributes。更重要的是,当我们进行此更改时,我们类的客户端不会出现损坏的界面!这很好,因为它让我们避免编写一堆样板代码,并且在我们确实需要它的情况下实现描述符相对简单。此外,这使我们的代码变得漂亮漂亮,代码中没有 self.get_this()self.set_that(3),并且 更具可读性self.thisself.that = 3

关于Python - @property 和 __init__() 中的设置有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265746/

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