在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
根据http://www.faqs.org/docs/diveintopython/fileinfo_private.html:
像大多数语言一样,Python具有私有元素的概念:
- 私有函数,无法从模块外部调用
但是,如果我定义了两个文件:
#a.py
__num=1
和:
#b.py
import a
print a.__num
当我运行b.py它打印出来,1没有任何例外.diveintopython错了,还是我误解了什么?而且是有一些方法可以不定义模块的功能为私有?
我正在编写一个由两部分组成的小型Python模块:
起初,我决定通过使用它在函数内部定义它来"隐藏"这个实现类,但这妨碍了可读性,如果多个函数重用同一个类,则不能使用它.
那么,除了评论和文档字符串之外,是否有一种机制将类标记为"私有"或"内部"?我知道下划线机制,但据我所知它只适用于变量,函数和方法名称.
在其他语言中,有助于生成更好代码的一般准则总是尽可能隐藏所有内容.如果对变量是私有还是受保护存在疑问,最好与私有变量一起使用.
对Python来说也是如此吗?我应该首先在所有内容上使用两个前导下划线,并且只在我需要时将它们隐藏起来(只有一个下划线)吗?
如果惯例只使用一个下划线,我也想知道其基本原理.
这是我在JBernardo的回答中留下的评论.它解释了为什么我问这个问题,以及为什么我想知道为什么Python与其他语言不同:
我来自语言,训练你认为一切都应该只是公开的,而不是更多.原因是这将减少依赖性并使代码更安全.反向做事的Python方式 - 从公共开始到隐藏 - 对我来说很奇怪.
对于Python中的私有成员和方法,我应该使用_foo(下划线)或__bar(双下划线)?
在Python中,我有以下示例类:
class Foo:
    self._attr = 0
    @property
    def attr(self):
        return self._attr
    @attr.setter
    def attr(self, value):
        self._attr = value
    @attr.deleter
    def attr(self):
        del self._attr
如您所见,我有一个简单的"私有"属性"_attr"和一个访问它的属性.有很多代码来声明一个简单的私有属性,我认为它不尊重"KISS"哲学来声明所有属性.
那么,如果我不需要特定的getter/setter/deleter,为什么不将所有属性声明为公共属性?
我的答案是:因为封装原则(OOP)说不然!
什么是最好的方法 ?
我已经定义了一个Vector有三个属性变量类:x,y和z.坐标必须是实数,但没有什么可以阻止人们做以下事情:
>>> v = Vector(8, 7.3, -1)
>>> v.x = "foo"
>>> v.x
"foo"
我可以像这样实现"类型安全":
import numbers
class Vector:
    def __init__(self, x, y, z):
        self.setposition(x, y, z)
    def setposition(self, x, y, z):
        for i in (x, y, z):
            if not isinstance(i, numbers.Real):
                raise TypeError("Real coordinates only")
        self.__x = x
        self.__y = y
        self.__z = z
    @property
    def x(self):
        return self.__x
    @property
    def y(self):
        return self.__y
    @property
    def z(self):
        return self.__z
......但这似乎不是Pythonic.
建议?
我想在我的班级中有一个函数,我将只在这个类的方法中使用它.我不会在这些方法的实现之外调用它.在C++中,我将使用在类的私有部分中声明的方法.在python中实现这样一个函数的最佳方法是什么?我想在这种情况下使用静态装饰器.我可以使用没有任何装饰器和self单词的函数
我正在努力改进我为Python程序编写单元测试用例的方法.我注意到在某些情况下,访问私有成员以确保方法正常运行会非常有帮助.一个示例案例是在尝试测试方法以确定没有预期返回值而非None的正确行为时.我知道这样做的简单方法就是将私有属性改为受保护属性,并直接测试它们.但是,我想找到一种不会暴露界面的方法.
那么如何测试类中的私有属性而不在接口中公开它们,或者,如果适用的话,更好的方法是测试这样的场景,以便正确的单元测试不一定需要私有属性访问?
在阅读了关于在 Python 中测试私有方法的内容后,具体参考以下接受的答案:如何对方法对象中的方法进行单元测试?,看来最好只测试公共接口。但是,我的班级看起来像这样:
class MyClass:
  def __init__(self):
    # init code
  def run(self):
    self.__A()
    self.__B()
    self.__C()
    self.__D()
  def __A(self):
    # code for __A
  def __B(self):
    # code for __B
  def __C(self):
    # code for __C
  def __D(self):
    # code for __D
本质上,我创建了一个类,用于通过函数管道处理一些输入数据。在这种情况下,最好测试私有函数而不测试公共run()函数吗?做这个的最好方式是什么?
python ×9
oop ×2
private ×2
unit-testing ×2
function ×1
module ×1
properties ×1
tdd ×1
testing ×1
type-safety ×1