Python 类中的变量作用域

2024-12-23 08:43:00
admin
原创
82
摘要:问题描述:在类中(函数外部)声明一个变量:所有类函数都可以访问它(基本上是一个公共变量)在类内的函数内声明一个变量:只有该函数可以访问它(它在该函数的范围内)在类内部的函数内声明一个变量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)

这将打印出

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用