我用谷歌搜索了一堆,似乎无法弄清楚如何实际做到这一点:
def __square(n): return n*n
def __square(n): return n*n class Foo: def __init__(self): self.baz = 2 def bar(self): return self.baz + __square(self.baz)
嗯,这不起作用.我得到NameError’_Foo__square’没有定义
为什么?
作为一种解决方法,我最终做了这样的事情:
class Foo: def __init__(self): self.baz = 2 def bar(self): return baz + self.square(self.baz) def square(self,n): return n*n
但这对我来说很愚蠢,因为square函数与Foo实例无关,我也不期望或希望它成为Foo实例上的方法.
什么是处理这种事情的“pythonic”方式?
编辑
我想出了至少一部分:我得到了这种行为,因为我认为这些实用程序方法是私有的,我一直在命名它们像def __square(n):.
我没有意识到这是特别的,当键入上面的例子时,我最初没有这样输入.我现在编辑了这个问题,以反映它实际输入的方式.
所以现在我的问题是:为什么将__置于顶级方法之前打破它,或者似乎?我理解这是在Python中命名“私有事物”的惯例,因为它在这种情况下不起作用,你会推荐什么呢?
解决方法
只需在_square中使用单个_,就不会出现此错误.
Python没有像“私人”这样的名字.按照约定 – 仅限于约定 – 不应从其他范围的代码中调用或访问前缀为_的函数或属性.
有些人在互联网上写了一些文章,试图为其他广为人知的OOP语言中存在的每个概念创建等价,实际上提到双下划线前缀相当于这些语言中的“私有”变量.这是旧文档中的一个常见错误 – 最近的文章避免了这个错误.
双下划线前缀的行为有所不同 – 有时可以起到与私有(而不是受保护)属性相同的作用:它在整个Python文档中将变量名称转换为称为“名称重整”的操作.通常这用于属性名称,并且它被转换为容器类唯一的名称,默认情况下,它只能在定义的类上访问,而不能在其子类上访问.转换是确定性的并且有详细记录:一个下划线和类名称前置于属性的名称(包括两个下划线).因此,具有__area属性的polygon类在运行时实际上将具有_polygon__区域 – 并且如果派生类Square(polygon):类将尝试在其代码中访问__area属性,则它实际上将在运行时访问_Square__area . (但是可以通过在代码中明确地编写Square._polygon__area来读取和写入超类’__area)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。