我想知道在类声明中定义类实例变量是必要的。
我尝试在创建对象(类实例)之后分配一个新的实例变量,看起来没有区别。这种方法有什么警告吗?
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'}
在self.foo
定义中声明def __init__(self, <arguments>):
与在实例化对象后声明它之间没有区别。
两个分配都具有实例级范围。
鉴于 -
class Context:
i_am_a_class_variable = 'class_string'
def __init__(self, bar):
self.bar = bar
见 -
>>> Context.i_am_a_class_variable
'class_string'
__init__(self)
函数在实例化期间分配实例属性。>>> 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'
根据您是否可以为属性赋值或创建新属性,如果您在init中或在创建对象后的任何其他位置执行此操作,则没有区别,因为在两种情况下它都会添加到对象的dict中(除非你使用插槽)
但是,如果您希望使用所需的状态初始化类(即,使用默认/预设值的某些必需变量),则应将其置于init中。由于只要创建了对象就会隐式调用init,因此对象将具有所需的状态。