Python 类中的变量作用域

2024-12-23 08:43:00
admin
原创
120
摘要:问题描述:在类中(函数外部)声明一个变量:所有类函数都可以访问它(基本上是一个公共变量)在类内的函数内声明一个变量:只有该函数可以访问它(它在该函数的范围内)在类内部的函数内声明一个变量self.(variable name):所有类函数都可以访问它(这与有何不同global (variable name)?...

问题描述:

在类中(函数外部)声明一个变量:所有类函数都可以访问它(基本上是一个公共变量)

在类内的函数内声明一个变量:只有该函数可以访问它(它在该函数的范围内)

在类内部的函数内声明一个变量self.(variable name):所有类函数都可以访问它(这与有何不同global (variable name)?)

由于没有私有/受保护,所有内容都是公共的,因此从类内部访问的所有内容都可以从类外部访问。

还有其他我应该知道的细微差别吗?或者我已经基本了解了?


解决方案 1:

由于您问题中的列表不是 100% 清楚,我决定用一个简单的例子来解释。它还包括一些__something您列表中未提及的内容,例如变量。

class Test:
    a = None
    b = None

    def __init__(self, a):
        print self.a
        self.a = a
        self._x = 123
        self.__y = 123
        b = 'meow'

一开始,ab只是为类本身定义的变量——可通过Test.a和访问,Test.b并且不特定于任何实例。

创建该类的实例时(导致__init__被执行):

  • print self.a找不到实例变量,因此返回类变量

  • self.a = a:创建了一个新的实例变量a。这会隐藏类变量,因此self.a现在将引用该实例变量;要访问类变量,现在必须使用Test.a

  • 赋值会self._x创建一个新的实例变量。它被视为“不属于公共 API”(又称受保护),但从技术上讲,它的行为并没有什么不同。

  • 赋值给 会self.__y创建一个名为 的新实例变量_Test__y,也就是说,它的名称是混乱的,因此,除非您使用混乱的名称,否则无法从类外部访问它。这可以用于“私有”变量。

  • 赋值创建一个局部变量。由于它没有保存在实例、类或全局范围内,因此除了函数b之外,其他地方都无法访问它。__init__

解决方案 2:

在类的顶层声明变量就像声明静态变量或类变量一样。使用 self 限定它是声明实例变量。类变量可以通过引用类名(例如Class.x = 5)来修改,并且所有实例都会继承这些更改。实例变量是实例私有的,只能由该实例修改。

您可以使用下划线实现某种程度的访问控制。请参阅Python 教程中的私有变量。按照惯例,以一个下划线开头的变量(例如)_foo是 API 的非公共部分,而以两个下划线开头__foo的名称(例如)将被误认为_classname__foo

解决方案 3:

虽然已经回答过了,但我还是想针对您的问题补充一些评论:

在类中(函数外部)声明一个变量:所有类函数都可以访问它(基本上是一个公共变量)

这就像一个静态变量,可以使用类名调用。这些变量可供所有函数使用,任何函数都可以修改它并打印它。

在类内的函数内声明一个变量:只有该函数可以访问它(它在该函数的范围内):

如果变量声明self时不使用 ,则只能在该函数内访问,就像局部变量一样。但是,如果使用selflike声明变量self.var= 'somevalue',则可以通过任何对象访问,但不能通过类名访问。

在类内部的函数中声明一个变量self.(variable name):所有类函数都可以访问它(这与有何不同global (variable name)?)

请参阅上面部分的答案。

由于没有私有/受保护,所以所有内容都是公开的,因此类内部可访问的所有内容都可以从类外部访问

是的,但是我们可以使用单下划线来告诉世界这个变量是私有的,但从技术上讲,这实际上并不意味着它是私有的。

解决方案 4:

我们可以使用其中的范围:情况 1:在类中

class test:
     def __init__(self, a):
          self.__elements = a
     def change_a(self): self.__elements = 5

情况 2:课堂外

t = test(5)

这将通过 object._classname__privatevaribalename 访问

print(t._test__elements)

这将打印出

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用