Python 类中的变量作用域

2024-12-23 08:43:00
admin
原创
136
摘要:问题描述:在类中(函数外部)声明一个变量:所有类函数都可以访问它(基本上是一个公共变量)在类内的函数内声明一个变量:只有该函数可以访问它(它在该函数的范围内)在类内部的函数内声明一个变量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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   27  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   22  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   19  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用