Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中实例变量与类变量的关系_Python - Fatal编程技术网

python中实例变量与类变量的关系

python中实例变量与类变量的关系,python,Python,这是一个类变量,self.i是实例变量,在执行时,我得到的o/p为1 但是如果注释类变量i我会得到一个错误 class myclass(object): i=0 def increase(self): self.i+=1 print('increased value:', self.i) if __name__=='__main__': m=myclass() m.increase() 类变量i和实例变量self.i之间的关系是

这是一个类变量,
self.i
是实例变量,在执行时,我得到的o/p为1

但是如果注释类变量
i
我会得到一个错误

class myclass(object):
    i=0
    def increase(self):
        self.i+=1
        print('increased value:', self.i)

if __name__=='__main__':
    m=myclass()
    m.increase()

类变量
i
和实例变量
self.i
之间的关系是什么。

您可以使用以下语句在类中声明一个常量<代码>i不应在以后修改

self.i+=1
AttributeError: 'myclass' object has no attribute 'i'
您可以使用

class myclass(object):
     i=0
如果需要计数器,可以在构造函数
\uuuu init\uuuu
中声明它,并在方法中增加它

 value = myclass().i

您面临的问题是在删除类变量后缺少
i
对象的定义。
i=0
语句是唯一的定义。这与任何其他变量相同,此处没有特殊情况:

class myclass(object):
    def __init__(self): 
        self.counter = 0
    def increase(self): 
        self.counter += 1
如果将其放在main或任何地方,则会产生相同的错误。为了执行增量
+=
,需要首先声明对象

你可以做:

i+=1

这没有任何意义,但我认为说明了这个问题。

发生的情况是,您用一个成员变量来隐藏类变量

查看实例化另一个myclass对象并向代码中添加一些打印输出时发生的情况:

class myclass(object):
def increase(self):
    self.i=0
    self.i+=1
    print('increased value:', self.i)
现在输出为:

class myclass(object):
    i=0
    def increase(self):
        myclass.i+=1
        print('incresed value:',self.i)

if __name__=='__main__':
    m=myclass()
    n=myclass()
    print("m.i=", m.i)
    print("n.i=", n.i)
    m.increase()
    print("m.i=", m.i)
    print("n.i=", n.i)
您可以看到,您增加了m的i成员的值,但没有增加n的值。这是因为self(就像c++中的This)总是引用当前对象实例。如果将代码更新为以下内容,则实际上是在增加类变量:

m.i= 0
n.i= 0
incresed value: 1
m.i= 1
n.i= 0
并且输出更改为以下内容:

def increase(self):
    myclass.i+=1
    print('incresed value:',self.i)

就像Guillaume Jacques在他的回答中没有提到的那样,如果您想使用成员变量,建议在uuu init_uuu()中初始化它们。在您的例子中,解释器只是在找不到成员变量时使用同名的类变量,并在同一行初始化成员变量(同名i)。如果注释掉类变量,则试图增加一个尚不存在的变量,因此会出现解释器错误。

类变量是一个可由类的所有实例更改的变量。您可以通过[class\u name].[variable\u name]来调用它

例如:

m.i= 0
n.i= 0
incresed value: 1
m.i= 1
n.i= 1
导致

class myclass(object):
    i=0
    def increase(self):
        myclass.i+=1
        print('incresed value:',self.i)

if __name__=='__main__':
    m=myclass()
    k = myclass()

    k.increase()
    m.increase()
    m.increase()
    m.increase()
    m.increase()
    k.increase()
另一方面,实例变量(如您所拥有的)只能由创建它的实例(使用self.[variable_name])访问。 要访问变量,首先需要实例化变量。像

incresed value: 1
incresed value: 2
incresed value: 3
incresed value: 4
incresed value: 5
incresed value: 6
将在运行时创建错误

a+=5
不会

在您的示例中,实例变量没有具体实例化。但是由于类变量(i=0),python会自动用类变量的值实例化实例变量(i)。(因为类和实例变量具有相同的名称)

换言之:

在您的示例中,当类变量 i=0 python不知道实例变量的值是多少 赛尔夫,我 一开始就应该有

a = 0
a+= 5