有人可以解释在Python中对象名称之前有前导下划线的确切含义吗?另外,解释单个和双重前导下划线之间的区别.此外,无论所讨论的对象是变量,函数,方法等,这个含义是否保持不变?
Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示:__myPrivateMethod().那么,如何解释这一点呢
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?!
我会对那些没有那么做的人解释一下.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Run Code Online (Sandbox Code Playgroud)
我在那里做的是使用公共方法和私有方法创建一个类并实例化它.
接下来,我称之为公共方法.
>>> obj.myPublicMethod() …Run Code Online (Sandbox Code Playgroud) 这是如何在Python中定义属性为"Speed"的类"Car"?我的背景是Java,似乎没有在Python中使用get/set方法.
class Car(object):
def __init__(self):
self._speed = 100
@property
def speed(self):
return self._speed
@speed.setter
def speed(self, value):
self._speed = value
Run Code Online (Sandbox Code Playgroud) 在凭证存储的上下文中,一种可能的威胁模型是攻击者,其能够:
AFAIK,对这种类型的攻击的共识是,它是不可能阻止的(因为凭证必须存储在内存中以便程序实际使用它们),但有几种技术可以缓解它:
第一种技术很容易实现,可能通过密钥环 (希望内核空间存储)
根据我的知识,第二个是没有编写C模块就完全无法实现(但我希望在这里被证明是错误的,或者有一个现有模块列表)
第三个是棘手的.
特别是,python是一种具有非常强大的内省和反射功能的语言,很难阻止对可以在解释器进程中执行python代码的任何人访问凭据.
似乎已达成共识,即无法强制实施私有属性,并且尝试使用私有属性最多会惹恼使用您的代码的其他程序员.
综合考虑所有这些因素,如何使用python安全地存储身份验证凭据?什么是最佳做法?关于语言"一切都是公共的"哲学可以做些什么吗?我知道"我们都在同意这里的成年人",但我们是否应该在与攻击者共享密码和使用其他语言之间做出选择?
我想看一下python deque类.当我检查源代码时,我在第10行找到了以下内容
from _collections import deque, defaultdict
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到这个_collections模块?我搜索了我的python源副本,但无法发现它.
这个班级在哪里?
当我使用 _ 作为类名的前缀时(另请参见this和this),该类将变为非公开的并且不会由 pydoc 显示:
class _DoNotShowMeInPydoc:
"""Class Documentation which is not displayed"""
Run Code Online (Sandbox Code Playgroud)
这正是我想要的,因为这个类仅在内部使用,对于使用该模块的人来说并不重要。
但是 - 如果有人想了解我的模块的内部结构(当然)也有文档记录,该怎么办?pydoc 是否有一个标志或选项来显示非公共类?
在scipy.stats您可以创建一个冻结的分布,使分布的参数(形状,位置和规模),以该实例被永久设置.
例如,您可以创建一个伽玛分布(scipy.stats.gamma)以a,loc及scale参数和冻结他们,使他们不必在每次所需要的时间分布各地的传递做.
import scipy.stats as stats
# Parameters for this particular gamma distribution
a, loc, scale = 3.14, 5.0, 2.0
# Do something with the general distribution parameterized
print 'gamma stats:', stats.gamma(a, loc=loc, scale=scale).stats()
# Create frozen distribution
rv = stats.gamma(a, loc=loc, scale=scale)
# Do something with the specific, already parameterized, distribution
print 'rv stats :', rv.stats()
Run Code Online (Sandbox Code Playgroud)
gamma stats: (array(11.280000000000001), array(12.56))
rv stats : …Run Code Online (Sandbox Code Playgroud) python ×7
python-2.7 ×2
credentials ×1
distribution ×1
parameters ×1
private ×1
pydoc ×1
random ×1
reflection ×1
scipy ×1
security ×1
storage ×1