有人可以解释在Python中对象名称之前有前导下划线的确切含义吗?另外,解释单个和双重前导下划线之间的区别.此外,无论所讨论的对象是变量,函数,方法等,这个含义是否保持不变?
我正在研究这个问题的答案: 是否可以在Enum中定义一个类常量?
最让我感兴趣的是Ethan Furman答案中的Constant课程.
class Constant:
def __init__(self, value):
self.value = value
def __get__(self, *args):
return self.value
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.value)
Run Code Online (Sandbox Code Playgroud)
问题是关于Python 3.4,但我使用的是2.7.在答案中,Ethan将引力常数设置为Planet类的实例变量,如下所示:
G = Constant(6.67300E-11)
Run Code Online (Sandbox Code Playgroud)
我在2.7中对这个类的测试表明只输入G就是这样:
Out[49]: Constant(3)
Run Code Online (Sandbox Code Playgroud)
(我将它设置为3以便于测试时使用.这看起来像__repr__
输出给我,如果我错了,请纠正我.)
该值可通过G.value获得.但是,在Ethan的回答中他使用了
return self.G * self.mass / (self.radius * self.radius)
Run Code Online (Sandbox Code Playgroud)
这显然只有在__repr__
输出值返回时才有效.现在,如果我class Constant:
改为class Constant(int):
然后输入GI仍然得到__repr__
输出,但如果我输入G * 4
我得到的12
不是我得到的错误.(TypeError:*:'instance'和'int'不支持的操作数类型)
很明显像int对象这样的东西在调用时可以输出一个数字.有没有一种我想要的魔术方法可以让我为Constant类做这个?由于常量可以是字符串,整数或浮点数,因此我更倾向于使用1个处理它们的类,而不是扩展这些对象的3个单独的类.
该值也可通过G.value设置.我可以将其锁定,以便Constant类的行为类似于实际的常量吗?(我怀疑答案是否定的.)
可能重复:
python中的私有成员
我有一些我真想隐藏的变量,因为它们不属于我的课堂.所有这些未记录的变量都会使继承变得无用.
如何隐藏您不希望在对象外显示的变量?
为了澄清为什么我需要私有变量,首先一个无法隐藏变量的例子只是一个不便,然后另一个真的是一个问题:
class MyObject(object):
def __init__(self, length):
self.length = length
def __len__(self):
return length
item = MyObject(5)
item.length
len(item)
Run Code Online (Sandbox Code Playgroud)
所以我有两种方法可以在这里访问项目的"长度".这只是一个不便而且没什么可怕的.
from wares import ImplementationSpecific
class MyThing(object):
def __init__(self):
self.__no_access_even_if_useful = ImplementationSpecific()
def restricted_access(self):
return self.__no_access_even_if_useful.mutable_value
thing = MyThing()
thing.restricted_access()
thing._MyThing__no_access_even_if_useful.something_useful_for_someone()
Run Code Online (Sandbox Code Playgroud)
所以说我希望有一天能改变实现......除非我真的埋没了实现细节,否则很有可能会破坏它.
我会接受它,因为任何人都可以编程.那个'任何人'可以从我的实现细节中找到一个有用的东西并使用它,即使我强烈劝阻这样做!只是说:"不,它不存在,尝试别的东西."
我正在做python koan(对于python 2.6)并且发现了一些我不理解的东西.其中一个文件在第160行中包含以下代码:
class Dog(object):
def __password(self):
return 'password'
Run Code Online (Sandbox Code Playgroud)
这个
rover = Dog()
password = rover.__password()
Run Code Online (Sandbox Code Playgroud)
结果是AttributeError
.这对我来说很清楚.(__password(self)
由于领先的两个下划线,是某种私人方法).
但是这个
rover._Dog__password()
Run Code Online (Sandbox Code Playgroud)
对我来说是一个谜.有人可以向我解释这是如何或为什么有效或更好地指向我所描述的文档?