Python类方法

Python类方法,python,class,Python,Class,在Python中,哪种方式(风格方面)是允许公共访问对象变量的最佳方式 我从不同的语言中看到了很多选择,我想知道哪一种(如果有的话)是首选的Python方法?以下是我目前面临的选择: 允许直接访问对象变量(例如打印(object.variable)),忽略数据隐藏 允许通过包装函数访问对象变量: 如果这是推荐的方法,您如何命名这些方法?(获取变量名(),还是仅获取变量名等?) 大家对此有什么建议 谢谢 Lucy在必要时才使用访问器;将简单属性转换为属性既快捷又简单,而且不需要修改客户端代码 当

在Python中,哪种方式(风格方面)是允许公共访问对象变量的最佳方式

我从不同的语言中看到了很多选择,我想知道哪一种(如果有的话)是首选的Python方法?以下是我目前面临的选择:

  • 允许直接访问对象变量(例如打印(object.variable)),忽略数据隐藏
  • 允许通过包装函数访问对象变量:

  • 如果这是推荐的方法,您如何命名这些方法?(获取变量名(),还是仅获取变量名等?)

    大家对此有什么建议

    谢谢


    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