在 `__init__()` 之外声明的实例变量在 python 中有什么不同吗?
Do instance variables declared outside of `__init__()` have any differences in python?
我想知道是否有必要在 class 声明中定义 class 实例变量。
我尝试在对象(class 实例)创建后分配一个新的实例变量,看起来没有区别。这种方法有什么注意事项吗?
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 __init__(self, <arguments>):
定义中声明 self.foo
与在对象实例化后声明它没有区别。
两项分配都具有实例级范围。
给定-
class Context:
i_am_a_class_variable = 'class_string'
def __init__(self, bar):
self.bar = bar
参见 -
- class 无需实例化对象即可访问属性。
>>> 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[=19 中进行,则没有区别=] 或创建对象后的任何其他地方,因为在这两种情况下,它都会添加到对象的 dict 中(除非您使用 slots)
但是,如果您希望 class 以所需状态进行初始化(即,具有一些具有 default/preset 值的强制变量),您应该将其放入 init。由于 init 在创建对象后立即被隐式调用,您的对象将具有所需的状态。
我想知道是否有必要在 class 声明中定义 class 实例变量。
我尝试在对象(class 实例)创建后分配一个新的实例变量,看起来没有区别。这种方法有什么注意事项吗?
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 __init__(self, <arguments>):
定义中声明 self.foo
与在对象实例化后声明它没有区别。
两项分配都具有实例级范围。
给定-
class Context:
i_am_a_class_variable = 'class_string'
def __init__(self, bar):
self.bar = bar
参见 -
- class 无需实例化对象即可访问属性。
>>> 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[=19 中进行,则没有区别=] 或创建对象后的任何其他地方,因为在这两种情况下,它都会添加到对象的 dict 中(除非您使用 slots)
但是,如果您希望 class 以所需状态进行初始化(即,具有一些具有 default/preset 值的强制变量),您应该将其放入 init。由于 init 在创建对象后立即被隐式调用,您的对象将具有所需的状态。