【问题标题】:In Python 3, can we have access specifiers of class attributes without using the underscore in naming?在 Python 3 中,我们可以在不使用下划线命名的情况下访问类属性的说明符吗?
【发布时间】:2020-08-29 00:24:56
【问题描述】:

在 MATLAB 代码中,我有一个用各种属性块定义的类。下面是一个例子:

properties (GetAccess = public, SetAccess = private)
    c = 0.3;
    MACHINE_PRECISION = 1e-16;
end

我想将类定义转换为其 python 版本,保持与 MATLAB 中相同的属性访问规范,即公共、私有或受保护。现在,一种方法是在名称前使用下划线。例如:

__c = 0.3
__MACHINE_PRECISION = 1e-16

不幸的是,我需要保持相同的名称,因为这些类定义在其他地方使用,并且必须保持相同的名称。有没有办法绕过这个障碍,即指定类属性的访问权限而不必更改它们的名称?

【问题讨论】:

  • __name *不是访问说明符。 Python 没有访问说明符一切本质上都是公开的。 没有公共、私有或受保护的。通过约定将变量标记为非公共 API 的一部分,您可以使用单个下划线.
  • 另外:“不幸的是,我需要保持相同的名称,因为这些类定义在其他地方使用,并且必须保持相同的名称。”这没有多大意义 应该是私有属性.
  • 实例变量或任何子类中不需要私有属性。更具体地说,在类定义中,我有公共和私有属性。私有属性用于类定义中的方法,我不希望这些属性出现在类的对象中。
  • “在类定义中的方法中使用,我不希望这些属性出现在类的对象中”:我认为没有黑魔法你不能用 python 做到这一点。您不能“指定类属性的访问权限”,句号。名字无关紧要。
  • @AndrasDeak 更具体地说,我不想要只读变量。我也想要私有变量。我刚刚展示了一个只读变量的示例,希望在 python 中为访问修饰符获得一些通用语法,类似于 MATLAB 或 Java。但是现在我看到python中没有这样的数据封装。

标签: python python-3.x matlab access-specifier


【解决方案1】:

您可以使用属性来继续使用旧名称作为 getter:

class C:
    def __init__(self):
        self._c = 0.3
        self._MACHINE_PRECISION = 1e-16

    @property
    def c(self):
        return self._c

    @property
    def MACHINE_PRECISION(self):
        return self._MACHINE_PRECISION

请注意,Python 中的私有类成员按照约定以下划线作为前缀(它们并没有真正被解释器隐藏,但这是大多数 Python 代码遵循的约定)。

【讨论】:

  • 不,你真的不应该这样做。这些propertys 毫无用处。
  • 属性的目的是允许通过它们的原始名称访问字段。
  • 它们绝对没有意义除了一堆不必要的间接性之外,这给你没有只是一个常规属性。
  • @PratikDash 这些property 对象毫无用处。不要这样做。最后一次 python 没有私有成员
  • Python 约定规定私有变量应以下划线为前缀。它甚至写在文档中。因此,您不应该在没有下划线的情况下放置私有变量,因此您必须使用属性来支持获取这些变量的遗留代码。
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多