相关疑难解决方法(0)

在对象名称之前单个和双下划线的含义是什么?

有人可以解释在Python中对象名称之前有前导下划线的确切含义吗?另外,解释单个和双重前导下划线之间的区别.此外,无论所讨论的对象是变量,函数,方法等,这个含义是否保持不变?

python naming-conventions

1205
推荐指数
13
解决办法
36万
查看次数

为什么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 encapsulation information-hiding python-2.7

632
推荐指数
11
解决办法
41万
查看次数

在Python中使用访问器的正确方法?

这是如何在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)

python python-2.7

15
推荐指数
1
解决办法
2万
查看次数

在python中保护凭证存储

攻击

在凭证存储的上下文中,一种可能的威胁模型是攻击者,其能够:

  • 检查任何(用户)进程内存
  • 读取本地(用户)文件

AFAIK,对这种类型的攻击的共识是,它是不可能阻止的(因为凭证必须存储在内存中以便程序实际使用它们),但有几种技术可以缓解它:

  • 最小化敏感数据存储在内存中的时间
  • 一旦不再需要数据,就会覆盖内存
  • 通过默默无闻的措施来破坏内存中的数据,保持移动以及其他安全性

特别是Python

第一种技术很容易实现,可能通过密钥环 (希望内核空间存储)

根据我的知识,第二个是没有编写C模块就完全无法实现(但我希望在这里被证明是错误的,或者有一个现有模块列表)

第三个是棘手的.

特别是,python是一种具有非常强大的内省和反射功能的语言,很难阻止对可以在解释器进程中执行python代码的任何人访问凭据.

似乎已达成共识,即无法强制实施私有属性,并且尝试使用私有属性最多会惹恼使用您的代码的其他程序员.

这个问题

综合考虑所有这些因素,如何使用python安全地存储身份验证凭据?什么是最佳做法?关于语言"一切都是公共的"哲学可以做些什么吗?我知道"我们都在同意这里的成年人",但我们是否应该在与攻击者共享密码和使用其他语言之间做出选择?

python security reflection storage credentials

14
推荐指数
1
解决办法
2万
查看次数

在python源代码中查找_collections

我想看一下python deque类.当我检查源代码时,我在第10行找到了以下内容

 from _collections import deque, defaultdict
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到这个_collections模块?我搜索了我的python源副本,但无法发现它.

这个班级在哪里?

python

8
推荐指数
1
解决办法
2690
查看次数

将 pydoc 用于非公共/私有类

当我使用 _ 作为类名的前缀时(另请参见thisthis),该类将变为非公开的并且不会由 pydoc 显示:

    class _DoNotShowMeInPydoc:
      """Class Documentation which is not displayed"""
Run Code Online (Sandbox Code Playgroud)

这正是我想要的,因为这个类仅在内部使用,对于使用该模块的人来说并不重要。

但是 - 如果有人想了解我的模块的内部结构(当然)也有文档记录,该怎么办?pydoc 是否有一个标志或选项来显示非公共类?

python private pydoc private-class

5
推荐指数
1
解决办法
1065
查看次数

如何从冻结的辣.分布中获取参数参数?

冷冻配送

scipy.stats您可以创建一个冻结的分布,使分布的参数(形状,位置和规模),以该实例被永久设置.

例如,您可以创建一个伽玛分布(scipy.stats.gamma)以a,locscale参数和冻结他们,使他们不必在每次所需要的时间分布各地的传递做.

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 random parameters distribution scipy

5
推荐指数
1
解决办法
1287
查看次数