【问题标题】:Making a private variable in Python [duplicate]在Python中创建一个私有变量[重复]
【发布时间】:2015-01-21 23:03:25
【问题描述】:

我只是在学习如何制作课程,并且我试图完成我的一项作业,但我很难将变量设为私有。我正在创建一个存储 ID、余额和年利率的 Account 类。所有这些都有默认值或可以设置。我的代码是这样的

class Account:
def __init__(self, ID=0, balance=100, annualInterestRate=0.0):
    self.ID = int(ID)
    self.balance = float(balance)
    self.annualInterestRate = float(annualInterestRate)
account = Account()
print(account.ID)
print(account.balance)
print(account.annualInterestRate)   

一切正常,但如果我尝试将变量设为私有(通过在变量前添加“__”),然后尝试访问这些值,我会得到一个 AttributeError。有谁知道我做错了什么?

    ... 
    self.__ID = int(ID)
    self.__balance = float(balance)
    self.__annualInterestRate = float(annualInterestRate)
account = Account()
print(account.ID)
print(account.balance)
print(account.annualInterestRate)   

【问题讨论】:

  • 归功于name mangling
  • 短版:只需使用一个下划线。或者,为了它的价值:不要打扰私有变量(也许只有当你使用属性时):你的第一个版本很好。由于 Python 不强制访问私有变量,我从来没有看到它的用途。
  • 您更改了他们的名称,为什么您希望旧名称继续有效?此外,这不正是您在将事情设为私有时尝试做的事情吗?
  • RemcoGerlich 是对的。在一般的 OOP 术语中,不能在声明范围之外访问“私有”字段(在这种情况下,在类定义之外)
  • 你应该和你的同学谈谈。看来你们都在同一个班,问同样的问题:stackoverflow.com/questions/27117010/…

标签: python class variables private


【解决方案1】:
>>> class Foo:
...     def __init__(self, value):
...         self.__value = value
...
>>> foo = Foo(42)
>>> print(foo.value)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'value'

您更改了他们的名称,为什么您希望旧名称继续有效? – RemcoGerlich

我想你的意思是:

>>> print(foo.__value)

但它也不好用:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__value'

最后:

>>> print(foo._Foo__value)
42

由于name mangling。 – 马尔辛

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 2023-04-02
    • 2011-03-18
    • 1970-01-01
    • 2016-02-29
    • 2021-03-20
    • 1970-01-01
    • 2017-01-07
    • 2012-08-25
    相关资源
    最近更新 更多