好的,首先要做的事情。
Python中没有“变量声明”或“变量初始化”这样的事情。
简而言之,我们称之为“分配”,但应该只是称为“命名”。
分配意味着“现在左侧的这个名称指的是评估右侧的结果,不管之前(如果有的话)引用了什么”。因此,Python的名称(可以说比“变量”更好的一个术语)没有关联的类型;但是,值的确如此。无论其类型如何,您都可以将相同的名称重新应用于任何事物,但事物仍然具有取决于其类型的行为。该名称只是一种引用值(对象)的方法。这回答你的第二个问题:你不要创建变量来保存自定义类型。您不会创建变量来保存任何特定的类型。你根本不“创造”变量。你给对象命名。
观点二:Python中遵循一个非常简单的规则,当涉及到的类,它实际上是比什么语言如Java,C++和C#做的更加一致:一切宣告内class
块是类的一部分。因此,这里编写的函数(def
)是方法,即类对象的一部分(不是以每个实例为基础存储),就像在Java,C++和C#中一样;但这里的其他名称是也是的一部分。同样,这些名称只是名称,它们没有关联类型,并且函数也是Python中的对象。因此:
class Example:
data = 42
def method(self): pass
类是对象太,在Python。
所以现在我们创建了一个名为Example
的对象,它代表了所有事物的类别Example
s。这个对象有两个用户提供的属性(在C++中,“成员”;在C#中,“字段或属性或方法”;在Java中,“字段或方法”)。其中一个名为data
,它存储整数值42
。另一个名为method
,它存储一个函数对象。(还有几个Python自动添加的属性。)
虽然这些属性仍然不是对象的一部分。从根本上讲,一个对象只是一堆更多的名称(属性名称),直到你找到不能再分开的东西。因此,如果您有意设置这些值,则可以在类的不同实例之间共享值,甚至可以在不同类的对象之间共享值。
让我们创建一个实例:
x = Example()
现在我们有一个名为x
一个单独的对象,这是Example
一个实例。 data
和method
实际上并不是对象的一部分,但我们仍然可以通过x
查找它们,因为Python在幕后有一些神奇的功能。特别是当我们查询method
时,我们将取而代之得到一个“绑定方法”(当我们称之为x
时,将自动作为self
参数通过,如果我们直接查找Example.method
则不会发生)。
当我们尝试使用x.data
时会发生什么?
当我们检查它时,首先在对象中查找它。如果在对象中找不到它,Python将在该类中查找。
但是,当我们将分配给x.data
时,Python将在该对象上创建一个属性。它将不是替换类的属性。
这使我们可以做对象初始化。如果存在,Python会在新实例创建时自动调用类'__init__
方法。在这种方法中,我们可以简单地分配给属性为每个对象上的属性设置初始值:
class Example:
name = "Ignored"
def __init__(self, name):
self.name = name
# rest as before
现在,当我们创建了一个Example
,我们必须指定一个name
,每个实例都有自己的name
。无论何时查找实例的.name
,Python都将忽略类属性Example.name
,因为将首先找到实例的属性。
最后一条警告:修改(突变)和分配是不同的事情!
在Python中,字符串是不可变的。他们不能被修改。当你这样做:
a = 'hi '
b = a
a += 'mom'
您不改变原来的“喜”字符串。在Python中这是不可能的。相反,您将创建新字符串'hi mom'
,并导致a
停止为'hi '
的名称,而是开始为'hi mom'
而不是名称。我们还为'hi '
创建了名称b
,并且在重新应用a
名称后,b
仍然是'hi '
的名称,因为'hi '
仍然存在并且未被更改。
但名单可以更改:
a = [1, 2, 3]
b = a
a += [4]
现在b
为[1,2,3,4]为好,因为我们同样的事情做b
的名称a
命名,然后我们改变那个东西。我们没有为a
创建一个新名单,因为Python只是简单地将+=
视为列表。
这对于对象很重要,因为如果您有一个列表作为类属性,并且使用实例修改列表,那么在所有其他实例中将会“看到”更改。这是因为(a)数据实际上是类对象的一部分,而不是任何实例对象; (b)因为你修改了列表而没有做简单的赋值,所以你没有创建一个隐藏类属性的新实例属性。
而且,关于第二个问题:在Python中,变量没有类型:值做。所以任何变量都可以容纳自定义对象。 – jpaugh
如果您不再将名称/标识符视为_variables_,它将有所帮助。他们是_references_对象 –
@gnibbler或他们的名字... – detly