为什么必须在方法内部定义实例变量?

时间:2019-01-22 08:19:53

标签: python python-3.x

为什么必须在方法内部定义实例变量?换句话说,为什么必须只将self用来在类的方法内部定义新变量。为什么不能使用self作为类的一部分但在方法之外定义变量。

“实例变量是每个类对象都有其自己的副本的那些变量”-此定义未涉及方法。因此,鉴于定义未提及方法,为什么我不能在类内部但在方法外部定义实例变量(换句话说,使用self来定义新变量)?

4 个答案:

答案 0 :(得分:2)

Python要求对象引用(例如Java中的隐式或显式https)是显式的。内部方法-绑定函数-函数定义中的第一个参数是实例。 (通常称为this,但您可以使用任何名称。)

如果您定义

self

没有 class C: x = 1 引用,与例如Java,其中self是隐式的。

答案 1 :(得分:0)

因为Python用于处理OOP的机制非常简单。确实没有定义类的特殊语法,class关键字在创建dict上是很薄的一层。您在class Foo:块中定义的所有内容基本上都以Foo.__dict__的内容结尾。因此,没有语法可以定义调用Foo()所产生的实例属性。您只需将实例属性附加到通过调用Foo()获得的对象上,该对象就是self中的__init__或其他实例方法。

答案 2 :(得分:0)

为此,您需要了解一些Python解释器的工作原理。

通常,每个类和方法定义都是单独的对象。 调用方法时,您要做的是将类实例作为第一个参数传递给方法。有了这个方法,该方法就知道它在哪个实例上运行(并因此知道将实例变量分配到哪里)。 但是,这仅适用于实例方法。 当然,您也可以使用@classmethod创建类方法,这些方法将类类型作为参数而不是实例,因此不能用于在self上下文中创建变量。

答案 3 :(得分:0)

  

为什么必须在方法内部定义实例变量?

他们没有。您可以在任何地方定义它们,只要有一个可变类型的实例,即可

class Foo(object):
    pass


f = Foo()
f.bar = 42
print(f.bar)
  

换句话说,为什么必须将self仅用于在类的方法内部定义新变量。为什么不能使用self作为类的一部分但在方法之外定义变量。

self(仅是命名约定,there's absolutely nothing magical here)用于表示当前实例。您怎么在没有任何实例的类块的顶级(甚至没有类本身的FWIW)上使用它?

在顶级类中定义类“成员”通常是静态语言,其中“对象”主要是(技术上)具有静态定义内存的结构(如果愿意,则为C样式结构或Pascal样式记录)结构体。

Python是一种动态语言,它使用dicts作为支持数据结构,因此someobj.attribute通常(减去计算的属性等)解析为someobj.__dict__["attribute"](和someobj.attribute = valuesomeobj.__dict__["attribute"] = value)。

所以1 /不需要具有固定的,明确定义的数据结构,而2 /但是它需要在末尾具有实例来为其设置属性。

请注意,您可以强制类使用固定的内存结构(而不​​是简单的字典)using slots,但是您仍然需要从方法内设置值(规范为__init__ ,其存在的原因很简单:初始化实例的属性。

相关问题