在`__init __()`之外声明的实例变量在python中有什么不同吗?

问题描述 投票:1回答:2

我想知道在类声明中定义类实例变量是必要的。

我尝试在创建对象(类实例)之后分配一个新的实例变量,看起来没有区别。这种方法有什么警告吗?

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'}
python class variables instance declaration
2个回答
1
投票

self.foo定义中声明def __init__(self, <arguments>):与在实例化对象后声明它之间没有区别。

两个分配都具有实例级范围。

鉴于 -

class Context:
    i_am_a_class_variable = 'class_string'
    def __init__(self, bar):
        self.bar = bar

见 -

  1. 可以在不实例化对象的情况下访问类属性。
>>> Context.i_am_a_class_variable
'class_string'
  1. 可以使用__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'
  1. 实例化属性可以在实例化后直接分配
>>> instance = Context('bar')
>>> instance.foo = 'foo'
>>> instance.foo
'foo'

0
投票

根据您是否可以为属性赋值或创建新属性,如果您在init中或在创建对象后的任何其他位置执行此操作,则没有区别,因为在两种情况下它都会添加到对象的dict中(除非你使用插槽)

但是,如果您希望使用所需的状态初始化类(即,使用默认/预设值的某些必需变量),则应将其置于init中。由于只要创建了对象就会隐式调用init,因此对象将具有所需的状态。

© www.soinside.com 2019 - 2024. All rights reserved.