Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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_Class_Oop_Variables_Static - Fatal编程技术网

为什么Python类不能识别静态变量

为什么Python类不能识别静态变量,python,class,oop,variables,static,Python,Class,Oop,Variables,Static,我试图用Python创建一个带有静态变量和方法(属性和行为)的类 当代码运行时,它说它无法使数组弹出,因为没有定义popSize您需要使用self.popSize或SimpleString.popSize访问它。当您在类中声明变量以便任何实例函数访问该变量时,您需要使用self或类名(在本例中为SimpleString),否则它会将函数中的任何变量视为该函数的局部变量 self和SimpleString之间的区别在于,使用self对popSize所做的任何更改都只会反映在实例的范围内,如果您创建

我试图用Python创建一个带有静态变量和方法(属性和行为)的类


当代码运行时,它说它无法使数组弹出,因为没有定义popSize

您需要使用
self.popSize
SimpleString.popSize
访问它。当您在类中声明变量以便任何实例函数访问该变量时,您需要使用
self
或类名(在本例中为
SimpleString
),否则它会将函数中的任何变量视为该函数的局部变量

self
SimpleString
之间的区别在于,使用
self
popSize
所做的任何更改都只会反映在实例的范围内,如果您创建另一个
SimpleString
popSize
的实例,则仍然是
1000
。如果使用
SimpleString.popSize
,则对该变量所做的任何更改都将传播到该类的任何实例

import numpy

class SimpleString():    
    popSize = 1000 
    displaySize = 5
    alphatbet = "abcdefghijklmnopqrstuvwxyz "

    def __init__(self):
        pop = numpy.empty(self.popSize, object)
        target = getTarget()
        targetSize = len(target)

您需要使用
self
或类对象来访问类属性:

def __init__(self):
    pop = numpy.empty(self.popSize, object)
    target = getTarget()
    targetSize = len(target)

仅当您希望绕过具有相同名称的实例属性时,才需要后一种形式:

>>> class Foo(object):
...     bar = 42
...     baz = 42
...     def __init__(self):
...         self.bar = 38
...     def printBar(self):
...         print self.bar, Foo.bar
...     def printBaz(self):
...         print self.baz, Foo.baz
... 
>>> f = Foo()
>>> f.printBar()
38 42
>>> f.printBaz()
42 42

这里的
self.bar
是一个实例属性(设置总是直接发生在对象上)。但是由于没有
baz
实例属性,因此
self.baz
将查找class属性。

属性必须始终使用
self
访问,例如
self.popSize
SimpleString.popSize
。。。。当它是静态类变量时。。。(如果您通过自我更改访问它,将不会反映回类变量)您拼错了字母表;-)语法:ftwNick,加入我的聊天室如果你想在一个类实例中修改它,并在其他类实例中看到反映的更改(如静态变量:P)@JoranBeasley:“静态变量”一词在这里真的放错地方了;Python有“类属性”和“实例属性”。是的,但是类属性的行为类似于其他语言中的静态变量(大多数情况下)。。。
def __init__(self):
    pop = numpy.empty(SimpleString.popSize, object)
    target = getTarget()
    targetSize = len(target)
>>> class Foo(object):
...     bar = 42
...     baz = 42
...     def __init__(self):
...         self.bar = 38
...     def printBar(self):
...         print self.bar, Foo.bar
...     def printBaz(self):
...         print self.baz, Foo.baz
... 
>>> f = Foo()
>>> f.printBar()
38 42
>>> f.printBaz()
42 42