Python类方法
在Python中,哪种方式(风格方面)是允许公共访问对象变量的最佳方式 我从不同的语言中看到了很多选择,我想知道哪一种(如果有的话)是首选的Python方法?以下是我目前面临的选择:Python类方法,python,class,Python,Class,在Python中,哪种方式(风格方面)是允许公共访问对象变量的最佳方式 我从不同的语言中看到了很多选择,我想知道哪一种(如果有的话)是首选的Python方法?以下是我目前面临的选择: 允许直接访问对象变量(例如打印(object.variable)),忽略数据隐藏 允许通过包装函数访问对象变量: 如果这是推荐的方法,您如何命名这些方法?(获取变量名(),还是仅获取变量名等?) 大家对此有什么建议 谢谢 Lucy在必要时才使用访问器;将简单属性转换为属性既快捷又简单,而且不需要修改客户端代码 当
如果这是推荐的方法,您如何命名这些方法?(获取变量名(),还是仅获取变量名等?) 大家对此有什么建议 谢谢
Lucy在必要时才使用访问器;将简单属性转换为属性既快捷又简单,而且不需要修改客户端代码
当我编写属性时,我对访问器使用
\u get\u FOO()
和\u set\u FOO()
,对属性本身使用\u FOO
。只允许直接访问任何希望作为公共API公开的变量。如果需要更改行为,可以随时在以后将其转换为属性
请注意,这与信息隐藏是正交的obj.get\u some\u implementation\u detail()
并不比obj好。some\u implementation\u detail
Python中没有“私有”变量。查看本文件第9.6节
不过,有一个约定,即类的用户应使用名称处理变量,以下划线开头,以避免直接接触。然而,没有任何机制可以防止这种情况
与损坏的名称相同(以2个下划线开头)。您可以使用
getter和setter(类似Java)
属性(类C)
我认为这只是风格问题。选择一个你更喜欢的。这同样适用于命名约定,选择一个约定并坚持它
在任何情况下,都可以使用伪私有变量(从两个下划线开始)进行数据隐藏。它们,与示例变量(
\ux
不以两个下划线开头)相反。我认为答案总是“视情况而定”。这里有一些有说服力的论据支持使用属性而不是getter/setter:实际上,它们可以。只是使用不同的名称,其中包括类名。变量的名称已损坏,而不是其访问级别。在您提到的同一文档中:“请注意,损坏规则的设计主要是为了避免事故;仍然可以访问或修改被视为私有的变量。”“私有”实例变量在Python中不存在,只能从对象内部访问。”(从您链接到的页面)您可以使用getter和setter,但是Python有一个完整的机制来避免您必须处理它们。保护是内置的。请参阅“访问器:为什么Python没有它们”:为什么会被否决?我清楚地写了“无法直接访问”,这是完全正确的,因为使用实例变量“\uuux”时,您无法访问“instance.\uuuux”,但必须使用“instance.\uclassname\uux”。这是关于如何使用这些变量的问题-只要您不访问任何名为\uu something
(而是使用属性.something
)的变量,您就可以了。Python并没有强制执行它,但它应该是每个程序员的惯例。比较变量及其名称是错误的__x只是名称,而不是变量本身。变量可以直接访问(只需使用另一个名称),也就是说,在Pyton中,您不能禁止这样做。而属性(或setter和getter)是间接访问变量的一种方式。在“private”有含义的语言中,不能直接访问“private”变量。您仍然可以使用某种形式的反射,但它不是该语言的一部分,而是使用该语言的框架的一部分(Java、C#等可能通过框架函数使用反射)。@Ingacio,您真的对要从类/实例外部访问的属性使用前导下划线吗?这与强大的Python约定背道而驰,\u-foo
说“notpublic!”,或者\u-foo
中的下划线只是一个输入错误?@Peter:该属性称为foo
。商店名为\u FOO
。
class X:
variable_a = 0
variable_b = 0
...
def get_variable_a(self):
return self.variable_a
class SomeClass(object):
...
def get_x(self):
return self._x
def set_x(self, x):
self._x = x
c = SomeClass()
print c.get_x()
c.set_x(10)
class SomeClass(object):
...
def get_x(self):
return self._x
def set_x(self, x):
self._x = x
x = property(get_x, set_x)
c = SomeClass()
print c.x
c.x = 10