在`\uu init\uu()之外声明的实例变量在python中是否有任何差异?
我想知道是否有必要在类声明中定义类实例变量 在对象(类实例)已经创建之后,我尝试分配一个新的实例变量,看起来没有什么区别。这种方法有什么警告吗在`\uu init\uu()之外声明的实例变量在python中是否有任何差异?,python,class,variables,instance,declaration,Python,Class,Variables,Instance,Declaration,我想知道是否有必要在类声明中定义类实例变量 在对象(类实例)已经创建之后,我尝试分配一个新的实例变量,看起来没有什么区别。这种方法有什么警告吗 class Context(): def __init__(self, extension): self.extension = extension c = Context('extension+') print(f"before: {c.__dict__}") c.new_var = 'new_var_content' p
class Context():
def __init__(self, extension):
self.extension = extension
c = Context('extension+')
print(f"before: {c.__dict__}")
c.new_var = 'new_var_content'
print(c.extension + c.new_var)
print(f"after: {c.__dict__}")
印刷品:
before: {'extension': 'extension+'}
extension+new_var_content
after: {'extension': 'extension+', 'new_var': 'new_var_content'}
在
def\uuu init\uuuu(self,):
定义中声明self.foo
与在对象实例化后声明它之间没有区别
这两个分配都具有实例级别的作用域
给定-
类上下文:
i_am_a_class_变量='class_string'
def ____;初始(自,条形):
self.bar=bar
见-
\uuuu init\uuuu(self)
函数进行分配李>
就是否可以为属性指定值或创建新属性而言,如果在对象创建后在init或其他任何位置执行,则没有区别,因为在这两种情况下,它都会添加到对象的dict(除非使用slot)
但是,如果您希望使用所需的状态初始化类(即,具有一些带有默认值/预设值的强制变量),则应将其放入init。由于init在对象创建后会被隐式调用,因此对象将具有所需的状态。它也已经在
\uuuu init\uuuu
中创建,所以当您调用实例方法时,扩展
和新变量
c
之间没有区别,只有自身。因此,执行c.attribute
是执行self.attribute
的一种明确方式。通常,在一个方法中进行每个实例操作,以便它可以被所有类实例重用。如果在C或C++中正确地返回此类型,则不允许声明这种类型。然而,在Python中它看起来是OK。
>>> Context.i_am_a_class_variable
'class_string'
>>> Context.bar
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-8be0704da5be> in <module>
----> 1 Context.bar
>>> instance = Context('bar')
>>> instance.bar
'bar'
>>> instance = Context('bar')
>>> instance.foo = 'foo'
>>> instance.foo
'foo'