Python 变量声明

2025-01-07 08:44:00
admin
原创
131
摘要:问题描述:我想阐明在 Python 中如何声明变量。我已经看到变量声明为class writer: path = "" 有时,没有明确的声明,而只是使用以下方法进行初始化__init__:def __init__(self, name): self.name = name...

问题描述:

我想阐明在 Python 中如何声明变量。

  1. 我已经看到变量声明为

class writer:
     path = ""

有时,没有明确的声明,而只是使用以下方法进行初始化__init__

def __init__(self, name):
    self.name = name

我理解的目的__init__,但建议在任何其他函数中声明变量吗?

  1. 如何创建变量来保存自定义类型?

class writer:
    path = "" # string value
    customObj = ??

解决方案 1:

好的,首先要做的事情。

Python 中不存在“变量声明”或“变量初始化”之类的东西。

这就是我们所说的“分配”,但也许应该称之为“命名”。

赋值意味着“左边这个名字现在指的是对右边进行求值的结果,不管它之前指的是什么(如果有的话)”。

foo = 'bar' # the name 'foo' is now a name for the string 'bar'
foo = 2 * 3 # the name 'foo' stops being a name for the string 'bar',
# and starts being a name for the integer 6, resulting from the multiplication

因此,Python 的名称(可能比“变量”更好)没有关联类型;值有。您可以将相同的名称重新应用于任何事物,无论其类型如何,但该事物的行为仍然取决于其类型。名称只是一种引用值(对象)的方式。这回答了您的第二个问题:您不会创建变量来保存自定义类型。您不会创建变量来保存任何特定类型。您根本不会“创建”变量。您给对象命名。

第二点:Python 在类方面遵循一个非常简单的规则,实际上比 Java、C++ 和 C# 等语言的规则更加一致:class块内声明的所有内容都是类的一部分。因此,def这里写的函数()是方法,即类对象的一部分(不是按实例存储的),就像在 Java、C++ 和 C# 中一样;但这里的其他名称也是类的一部分。同样,名称只是名称,它们没有关联类型,函数在 Python 中也是对象。因此:

class Example:
    data = 42
    def method(self): pass

在 Python 中,类也是对象。

现在我们创建了一个名为 的对象Example,它代表了所有事物的类Example。此对象具有两个用户提供的属性(在 C++ 中为“成员”;在 C# 中为“字段或属性或方法”;在 Java 中为“字段或方法”)。其中一个属性名为data,它存储整数值42。另一个属性名为method,它存储一个函数对象。(Python 还自动添加了其他几个属性。)

但这些属性仍然不是对象真正的组成部分。从根本上讲,对象只是一堆名称(属性名称)的集合,直到你发现无法再分割的东西。因此,如果你有意设置,值可以在一个类的不同实例之间共享,甚至可以在不同类的对象之间共享。

让我们创建一个实例:

x = Example()

现在我们有了一个名为 的单独对象x,它是 的一个实例Exampledatamethod实际上不是对象的一部分,但我们仍然可以通过 查找它们,x因为 Python 在幕后施展了一些魔法。method特别是,当我们查找 时,我们将获得一个“绑定方法”(当我们调用它时,x它会自动作为参数传递self,而如果我们直接查找,则不会发生这种情况Example.method)。

当我们尝试使用时会发生什么x.data

当我们检查它时,首先在对象中查找。如果在对象中找不到,Python 会在类中查找。

然而,当我们赋值给 x.data时,Python 会在对象上创建一个属性。它不会替换类的属性。

这允许我们进行对象__init__初始化。如果存在新实例,Python 将在创建新实例时自动调用类的方法。在此方法中,我们可以简单地分配给属性以设置每个对象上该属性的初始值:

class Example:
    name = "Ignored"
    def __init__(self, name):
        self.name = name
    # rest as before

name现在,我们在创建时必须指定Example,并且每个实例都有自己的。每当我们查找实例的时, namePython 都会忽略类属性,因为会首先找到实例的属性。Example.name`.name`

最后一点警告:修改(变异)和分配是不同的事情!

在 Python 中,字符串是不可变的。它们无法被修改。当您执行以下操作时:

a = 'hi '
b = a
a += 'mom'

无需更改原始的“hi”字符串。这在 Python 中是不可能的。相反,您创建一个字符串'hi mom',并使a不再是 的名称'hi ',而是开始成为 的名称'hi mom'。我们也为b命名'hi ',在重新应用该a名称后,b仍然是 的名称'hi ',因为'hi '仍然存在并且没有改变。

但列表可以改变:

a = [1, 2, 3]
b = a
a += [4]

现在b也是 [1, 2, 3, 4],因为我们b为命名的相同事物创建了一个名称a,然后我们改变了那个事物。我们没有为a要命名的事物创建一个新列表,因为 Python+=对列表的处理方式不同。

这对于对象来说很重要,因为如果您将列表作为类属性,并使用实例来修改列表,则更改将在所有其他实例中“可见”。这是因为 (a) 数据实际上是类对象的一部分,而不是任何实例对象;(b) 因为您正在修改列表而不是执行简单的赋值,所以您没有创建隐藏类属性的新实例属性。

解决方案 2:

这可能晚了 6 年,但在 Python 3.5 及更高版本中,你可以像这样提示变量类型:

variable_name: type_name

或这样:

variable_name # type: shinyType

此提示在核心 Python 解释器中不起作用,但许多工具会使用它来帮助程序员编写正确的代码。

因此,就您而言(如果您已经CustomObject定义了一个类),您可以执行以下操作:

customObj: CustomObject

请参阅此类型提示问题或有关如何使用静态类型检查的文章以获取更多信息。

解决方案 3:

在 Python 中无需声明新变量。如果我们谈论的是函数或模块中的变量,则无需声明。只需在需要的地方将值分配给名称:mymagic = "Magic"。Python 中的变量可以保存任何类型的值,您无法限制这一点。

不过,您的问题具体询问的是类、对象和实例变量。创建实例变量的惯用方法是在__init__方法中,而不是其他地方——虽然您可以在其他方法中创建新的实例变量,甚至在无关的代码中,但这是个坏主意。这会让您的代码难以推理或维护。

例如:

class Thing(object):

    def __init__(self, magic):
        self.magic = magic

简单。现在这个类的实例有一个magic属性:

thingo = Thing("More magic")
# thingo.magic is now "More magic"

在类本身的命名空间中创建变量会导致完全不同的行为。它在功能上是不同的,只有在有特定原因的情况下才应该这样做。例如:

class Thing(object):

    magic = "Magic"

    def __init__(self):
        pass

现在尝试:

thingo = Thing()
Thing.magic = 1
# thingo.magic is now 1

或者:

class Thing(object):

    magic = ["More", "magic"]

    def __init__(self):
        pass

thing1 = Thing()
thing2 = Thing()
thing1.magic.append("here")
# thing1.magic AND thing2.magic is now ["More", "magic", "here"]

这是因为类本身的命名空间与从其创建的对象的命名空间不同。我将留给您进一步研究。

要点是,惯用的 Python 是 (a) 在您的__init__方法中初始化对象属性,以及 (b) 根据需要记录您的类的行为。您不需要费心为您编写的所有内容编写全面的 Sphinx 级文档,但至少要对您或其他人可能需要的任何细节进行一些注释。

解决方案 4:

为了确定范围,我使用:

custom_object = None

解决方案 5:

变量具有作用域,因此拥有特定于函数的变量是合适的。您不必总是明确说明它们的定义;通常您可以直接使用它们。只有当您想对变量类型执行特定操作(例如对列表执行追加操作)时,才需要在开始使用它们之前定义它们。这就是典型的例子。

list = []
for i in stuff:
  list.append(i)

顺便说一句,这不是设置列表的好方法。最好这样说:

list = [i for i in stuff] # list comprehension

...但我离题了。

你的另一个问题。自定义对象本身应该是一个类。

class CustomObject(): # always capitalize the class name...this is not syntax, just style.
  pass
customObj = CustomObject()

解决方案 6:

从 Python 3 开始,您可以按类型明确声明变量。

例如,要声明一个整数,可以按如下方式操作:

x: int = 3

或者:

def f(x: int):
    return x

有关它的更多详细信息,请参阅此问题:
在 Python 中明确声明变量类型

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2911  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1774  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   0  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   0  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用