为什么必须在方法内部定义实例变量?换句话说,为什么必须只将self用来在类的方法内部定义新变量。为什么不能使用self作为类的一部分但在方法之外定义变量。
“实例变量是每个类对象都有其自己的副本的那些变量”-此定义未涉及方法。因此,鉴于定义未提及方法,为什么我不能在类内部但在方法外部定义实例变量(换句话说,使用self来定义新变量)?
答案 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 = value
为someobj.__dict__["attribute"] = value
)。
所以1 /不需要具有固定的,明确定义的数据结构,而2 /但是它需要在末尾具有实例来为其设置属性。
请注意,您可以强制类使用固定的内存结构(而不是简单的字典)using slots,但是您仍然需要从方法内设置值(规范为__init__
,其存在的原因很简单:初始化实例的属性。