在`\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'