学习Python,并有一些基本的疑问。
1.我看到variable declaration(这里的路径)是
class writer:
path = ""
有时,没有显式声明,而是通过__init__
初始化。
def __init__(self, name):
self.name = name
我理解__init__
的目的,但在任何其他函数中声明变量是否可取。
2.如何创建变量来保存自定义类型?
class writer:
path = "" # string value
customObj = ??
Tags:
好吧,先做第一件事。
在Python中没有“变量声明”或“变量初始化”之类的东西。
这就是我们所说的“任务”,但很可能应该称之为“命名”。
赋值意味着“左边的这个名字现在指的是对右边求值的结果,不管它以前指的是什么(如果有的话)”。
因此,Python的名称(一个比“变量”更好的术语,可以说)没有关联的类型;值有关联。您可以将同一名称重新应用于任何对象,而不管其类型如何,但该对象仍具有依赖于其类型的行为。名称只是一种引用值(对象)的方式。这回答了您的第二个问题:您不需要创建变量来保存自定义类型。您不会创建变量来保存任何特定类型。你根本不“创建”变量。为对象命名。
第二点:Python在类中遵循一个非常简单的规则,它实际上比java、C++和C语言这样的语言更一致:<强> ^ ^ {CD1>}块中声明的所有内容都是类< /强>的一部分。因此,这里写的函数(^ {CD2}})是方法,即类对象的一部分(不是按每个实例存储),就像在爪哇、C++和C.*中一样;但是这里的其他名称是<强>也<>强>类的一部分。同样,这些名称只是名称,没有关联的类型,而且在Python中函数也是对象。因此:在Python中,类也是对象。
<> P> >现在我们创建了一个<强>对象<强> >名^ { CD3>},它代表了所有^ ^data
,它存储整数值42
。另一个名为method
,它存储一个函数对象。(Python还自动添加了几个属性。)不过,这些属性仍然不是对象的一部分。从根本上说,一个对象只是多个名称(属性名称)的组合,直到你找到不能再分割的东西。因此,值可以在类的不同实例之间共享,甚至在不同类的对象之间共享,如果您有意设置的话。
让我们创建一个实例:
现在我们有一个名为
x
的单独对象,它是Example
的实例。data
和method
实际上并不是对象的一部分,但是我们仍然可以通过x
查找它们,因为Python在幕后有一些魔力。特别是当我们查找method
时,我们将得到一个“绑定方法”(当我们调用它时,x
将自动作为self
参数传递,如果我们直接查找Example.method
则不会发生这种情况)。当我们尝试使用
x.data
时会发生什么?当我们检查它的时候,它首先在物体中被抬起。如果在对象中找不到它,Python将在类中查找。
但是,当我们将赋给
x.data
时,Python将在对象上创建一个属性。它将而不是替换类的属性。这允许我们进行对象初始化。Python将在创建新实例(如果存在)时自动对其调用类‘
__init__
方法。在这种方法中,我们可以简单地分配给属性来设置每个对象上该属性的初始值:现在我们必须在创建
Example
时指定name
,并且每个实例都有自己的name
。每当我们查找实例的.name
时,Python将忽略类属性Example.name
,因为首先会找到实例的属性。最后一个警告:修改(突变)和赋值不同耳鼻喉科的东西!
在Python中,字符串是不可变的。它们不能修改。当你这样做时:
不要更改原始的“hi”字符串。这在Python中是不可能的。相反,您创建一个新的字符串
'hi mom'
,并使a
不再是'hi '
的名称,而是开始成为'hi mom'
的名称。我们还将b
作为'hi '
的名称,在重新应用a
名称之后,b
仍然是'hi '
的名称,因为'hi '
仍然存在并且没有更改。但列表可以更改:
现在
b
也是[1,2,3,4],因为我们为b
命名的同一个东西命名了a
,然后我们改变了那个东西。我们没有为a
命名创建一个新列表,因为Python只是以不同的方式对待+=
列表。这对对象很重要,因为如果您将列表作为类属性,并使用实例来修改列表,那么更改将在所有其他实例中“可见”。这是因为(a)数据实际上是类对象的一部分,而不是任何实例对象;(b)因为您正在修改列表而不是执行简单的赋值,所以没有创建隐藏类属性的新实例属性。
这可能晚了6年,但是在Python3.5及更高版本中,您声明了一个如下所示的变量类型:
或者这个:
因此,在您的情况下(如果定义了
CustomObject
类),您可以执行以下操作:有关详细信息,请参见this或that。
不需要在Python中声明新变量。如果我们讨论的是函数或模块中的变量,则不需要声明。只要给需要的名称赋值:
mymagic = "Magic"
。Python中的变量可以保存任何类型的值,并且不能对其进行限制。不过,您的问题特别涉及类、对象和实例变量。创建实例变量的惯用方法是在
__init__
方法中,而不是在其他方法中创建新的实例变量,甚至是在不相关的代码中,这只是一个坏主意。这将使您的代码难以推理或维护。例如:
很简单。现在这个类的实例有一个
magic
属性:在类本身的命名空间中创建变量会导致完全不同的行为。它在功能上是不同的,只有当你有特定的原因时才应该这样做。例如:
现在试试:
或:
这是因为类本身的命名空间与从它创建的对象的命名空间不同。我让你再研究一下。
这里要说明的是,惯用的Python是(a)初始化
__init__
方法中的对象属性,以及(b)根据需要记录类的行为。你不必为你所写的每一件事费尽心思地编写完整的狮身人面像级文档,但至少需要对你或其他人可能需要了解的任何细节发表一些评论。相关问题 更多 >
编程相关推荐