Python变量声明
学习,并有一些基本的疑问 1.我看到(这里的路径)是 有时,没有显式声明,而是通过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 = ?? 变量具有作用域,因此,是的,具有特定于函数的变量是
\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语言这样的语言更为一致:
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