Python变量声明

Python变量声明,python,python-3.x,python-2.7,variable-declaration,Python,Python 3.x,Python 2.7,Variable Declaration,学习,并有一些基本的疑问 1.我看到(这里的路径)是 有时,没有显式声明,而是通过\uuuu init\uuu初始化 def __init__(self, name): self.name = name 我理解\uuuu init\uuuu的目的,但建议在任何其他函数中声明变量 2.如何创建变量来保存自定义类型 class writer: path = "" # string value customObj = ?? 变量具有作用域,因此,是的,具有特定于函数的变量是

学习,并有一些基本的疑问

1.我看到(这里的路径)是

有时,没有显式声明,而是通过
\uuuu init\uuu
初始化

def __init__(self, name):
    self.name = name
我理解
\uuuu init\uuuu
的目的,但建议在任何其他函数中声明变量

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

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

变量具有作用域,因此,是的,具有特定于函数的变量是合适的。你不必总是明确他们的定义;通常你可以直接使用它们。只有当您想做一些特定于变量类型的事情时,比如为列表追加,才需要在开始使用它们之前定义它们。这方面的典型例子

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()

不需要在Python中声明新变量。如果我们讨论的是函数或模块中的变量,则不需要声明。只需在需要的地方为名称赋值:
mymagic=“Magic”
。Python中的变量可以保存任何类型的值,您不能对此进行限制

不过,您的问题专门询问了类、对象和实例变量。创建实例变量的惯用方法是在
\uuuu init\uuuu
方法中,而不是在其他任何地方-虽然您可以在其他方法中,甚至在不相关的代码中创建新的实例变量,但这只是一个坏主意。这将使您的代码难以推理或维护

例如:

class Thing(object):

    def __init__(self, magic):
        self.magic = magic
class Thing(object):

    magic = "Magic"

    def __init__(self):
        pass
简单。现在该类的实例具有
magic
属性:

thingo = Thing("More magic")
# thingo.magic is now "More magic"
在类本身的名称空间中创建变量会导致完全不同的行为。这在功能上是不同的,只有当你有特定的理由这样做时,你才应该这样做。例如:

class Thing(object):

    def __init__(self, magic):
        self.magic = magic
class Thing(object):

    magic = "Magic"

    def __init__(self):
        pass
现在试试:

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

这是因为类本身的名称空间与从中创建的对象的名称空间不同。我会让你进一步研究一下


带回家的信息是,惯用Python将(a)初始化
\uuu init\uuu
方法中的对象属性,以及(b)根据需要记录类的行为。你不必为你所写的每一件事去费心编写完整的斯芬克斯级文档,但至少需要一些关于你或其他人可能需要了解的任何细节的评论。

好的,首先要做的事

Python中没有“变量声明”或“变量初始化”之类的东西。

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

赋值的意思是“左侧的这个名称现在指的是计算右侧的结果,而不管它之前指的是什么(如果有的话)”

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

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

class Example:
    data = 42
    def method(self): pass
在Python中,类也是对象

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

不过,这些属性仍然不是对象的一部分。从根本上说,一个对象只是一堆更多的名称(属性名称),直到你开始着手处理那些不能再分割的东西。因此,如果您有意设置,值可以在类的不同实例之间共享,甚至在不同类的对象之间共享

让我们创建一个实例:

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

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

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

但是,当我们分配给
x.data
时,Python将在对象上创建一个属性。它将替换类的属性

这使我们能够做o
x = Example()
class Example:
    name = "Ignored"
    def __init__(self, name):
        self.name = name
    # rest as before
a = 'hi '
b = a
a += 'mom'
a = [1, 2, 3]
b = a
a += [4]
custom_object = None
variable_name: type_name
variable_name # type: shinyType
customObj: CustomObject
x: int = 3
def f(x: int):
    return x