正在初始化\uu init外部的字段__

2024-10-01 15:44:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些帮助来理解python初始化是如何工作的。我有一个类(Bar)和另一个类(Foo)作为字段/变量。当我尝试直接在Bar中初始化这个变量时(不是在类\uyuinit_uu中),Bar的所有实例都将指向同一个Foo。但是,如果我有一个-uyuinit\uu方法,就像在Bar2中一样,每个Bar2实例将有一个唯一的Foo实例。这是怎么回事?在

class Foo():
    number = 0

class Bar():
    foo = Foo()

class Bar2():
    foo = None

    def __init__(self):
        self.foo = Foo()

first = Bar()
second = Bar()

print "Bar"
print first
print second
print first.foo
print second.foo

first = Bar2()
second = Bar2()

print "\nBar2"
print first
print second
print first.foo
print second.foo

例如,输出将是:

^{pr2}$

使用Bar,两个实例将引用同一个Foo实例。为什么?在

编辑:更正打印错误第一.foo两次,Bar。结果的行为仍然可以在输出中看到。在


Tags: 实例方法selfnumberfoobarclassfirst
3条回答

Python是一种动态语言。在像Java这样的静态语言中,编译器读取代码,找到类定义,判断它们是否正确,并相应地生成一些代码。在python中,类定义(或函数定义)与其他定义一样只是一个语句,就像对变量的赋值一样。语法有点不同。在

在定义一个类时,解释器运行类定义,也就是说,它运行类行之后的所有代码。如果找到函数定义,它也会运行它们,即定义函数并将它们绑定到函数名。由于类和函数定义和任何其他赋值一样都是语句,所以您也可以在许多地方使用它们。例如如下:

def foo():
  class A: pass
  a = A()
  a.msg = "Hello"
  return a

因为python是duck类型的(如果它像鸭子一样嘎嘎叫,看起来像鸭子,那么它就是一个),foo函数的用户甚至不必知道该类被调用了什么,他们只需要知道foo返回一个带有成员msg的对象。你可以这样使用它:

^{pr2}$

因此在您的示例中,当执行Bar的定义时,类语句将运行,包括Foo对象的创建。当执行Bar2的定义时,类语句在其中运行,函数的定义名为init。Python在创建一个对象时(在调用另一个函数__new__之后,但这不在该点之外)使用它作为要调用的函数的名称。在

因此,类定义(类内部的代码,其中Bar创建Foo对象)只在引入类时运行一次。__init__在每次生成新对象时都会被调用一次又一次,因此在Bar2中,Foo的创建也会一次又一次地完成。在

据我所知,“foo=None”这个词是多余的,其实并不需要。在python中,可以从任何地方添加实例变量,甚至可以从类外部添加,当然也可以从__init__内部添加。在

类也是对象,它们有自己的一组变量。不仅如此,当Python在对象中找不到变量时,它会在类中查找,看看是否可以在那里找到它,这就是它所使用的。由于该类在该类的所有对象之间共享,因此该类中的变量也是共享的。在

Bar.foo是一个类变量。在创建类时初始化一次。在

(请注意,您的代码als打印了first.foo两次,因此难怪输出是相同的。)

相关问题 更多 >

    热门问题