加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何在Python类中使用模块函数

发布时间:2020-12-20 11:48:35 所属栏目:Python 来源:网络整理
导读:参见英文答案 How do you call a private module function from inside a class?????????????????????????????????????1个 我用谷歌搜索了一堆,似乎无法弄清楚如何实际做到这一点: 鉴于我有一个通用的实用方法,如下所示: def __square(n): return n*n 然后
参见英文答案 > How do you call a private module function from inside a class?????????????????????????????????????1个
我用谷歌搜索了一堆,似乎无法弄清楚如何实际做到这一点:

鉴于我有一个通用的实用方法,如下所示:

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中命名“私有事物”的惯例,因为它在这种情况下不起作用,你会推荐什么呢?

解决方法

您不应该在函数名前加两个下划线 – __ – 只要在类中的代码中找到以两个下划线名称为前缀的名称,Python编译器就会执行名称重整操作. – 因此,在编译(到字节码)时,对__square的引用会在对不存在的_Foo_square的引用中进行转换.

只需在_square中使用单个_,就不会出现此错误.

Python没有像“私人”这样的名字.按照约定 – 仅限于约定 – 不应从其他范围的代码中调用或访问前缀为_的函数或属性.

有些人在互联网上写了一些文章,试图为其他广为人知的OOP语言中存在的每个概念创建等价,实际上提到双下划线前缀相当于这些语言中的“私有”变量.这是旧文档中的一个常见错误 – 最近的文章避免了这个错误.

双下划线前缀的行为有所不同 – 有时可以起到与私有(而不是受保护)属性相同的作用:它在整个Python文档中将变量名称转换为称为“名称重整”的操作.通常这用于属性名称,并且它被转换为容器类唯一的名称,默认情况下,它只能在定义的类上访问,而不能在其子类上访问.转换是确定性的并且有详细记录:一个下划线和类名称前置于属性的名称(包括两个下划线).因此,具有__area属性的Polygon类在运行时实际上将具有_Polygon__区域 – 并且如果派生类Square(Polygon):类将尝试在其代码中访问__area属性,则它实际上将在运行时访问_Square__area . (但是可以通过在代码中明确地编写Square._Polygon__area来读取和写入超类’__area)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读