使用get / set似乎是Java中的常见做法(出于各种原因),但我几乎看不到使用它的Python代码。
为什么在Python中使用或避免使用get / set方法?
酷链接:Python is not Java :)
在Java中,您必须使用getter和setter,因为使用公共字段使您无法返回并在以后使用getter和setter改变主意。所以在Java中,你可能也会提前做好准备工作。在Python中,这很愚蠢,因为您可以从普通属性开始并随时改变主意,而不会影响该类的任何客户端。所以,不要写getter和setter。
在python中,您可以直接访问该属性,因为它是公共的:
class MyClass:
def __init__(self):
self.my_attribute = 0
my_object = MyClass()
my_object.my_attribute = 1 # etc.
如果要对属性的访问或变异执行某些操作,可以使用properties:
class MyClass:
def __init__(self):
self._my_attribute = 0
@property
def my_attribute(self):
# Do something if you want
return self._my_attribute
@my_attribute.setter
def my_attribute(self, value):
# Do something if you want
self._my_attribute = value
至关重要的是,客户端代码保持不变。
以下是Guido van Rossum在Masterminds of Programming中所说的内容
“对抗语言”是什么意思?
Guido:这通常意味着他们试图继续使用不同语言的习惯。
[...]人们会将所有内容都变成一个类,并将每个访问权转变为一个存取方法, 在Python中,这真的不是明智之举;你会有更详细的代码 更难调试,运行速度慢很多。你知道“你可以用任何语言写FORTRAN吗?”您也可以使用任何语言编写Java。
不,这是unpythonic。通常接受的方法是使用普通数据属性并用属性替换需要更复杂的get / set逻辑的属性。
对你的问题的简短回答是否定的,你应该在需要时使用属性。 Ryan Tamyoko在他的文章Getters/Setters/Fuxors中提供了长篇答案
消除这一切的基本价值在于,您希望努力确保每一行代码都对程序员有一定的价值或意义。编程语言适用于人类,而不适用于机器。如果你的代码看起来没有做任何有用的东西,很难阅读,或者看起来很乏味,那么很有可能Python有一些语言功能可以让你删除它。
你的观察是正确的。这不是Python编程的常规风格。属性都是公共的,因此您只需访问(获取,设置,删除)它们,就像使用包含它们的任何对象(不仅仅是类或实例)的属性一样。当Java程序员学习Python时很容易理解,因为他们的Python代码看起来像使用Python语法的Java!
我绝对同意所有以前的海报,特别是@Maximiliano链接到Phillip的着名文章和@Max的建议,即比设置(和获取)类和实例属性的标准方法更复杂的是使用Properties(或描述符来概括更多)自定义属性的获取和设置! (这包括能够添加您自己的私人,受保护,朋友或任何您想要的政策的自定义版本,如果您需要除公共之外的其他内容。)
作为一个有趣的演示,在Core Python Programming(第13章,第13.16节)中,我想出了一个使用描述符将属性存储到磁盘而不是内存中的示例!是的,这是一种奇怪的持久存储形式,但它确实向您展示了可能的存储示例!
这是另一篇你可能会觉得有用的相关文章:Python: multiple properties, one setter/getter
我来这里是为了那个答案(不幸的是我不能)。但我找到了其他地方的工作。以下代码可以替代get。
class get_var_lis:
def __init__(self):
pass
def __call__(self):
return [2,3,4]
def __iter__(self):
return iter([2,3,4])
some_other_var = get_var_lis
这只是一种解决方法。通过使用上述概念,您可以轻松地在py中构建get / set方法。
我们的老师在课堂上展示了一个例子来解释我们何时应该使用访问器功能
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()