12

我正在尝试使用静态变量和方法(属性和行为)在 Python 中创建一个类

import numpy

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

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

当代码运行时,虽然它说它不能使数组弹出,因为没有定义 popSize

4

2 回答 2

21

您需要使用self.popSize或访问它SimpleString.popSize。当您在类中声明一个变量以便任何实例函数访问该变量时,您将需要使用self或类名(在这种情况下SimpleString),否则它将把函数中的任何变量视为该函数的局部变量功能。

self和之间的区别在于SimpleStringself您所做的任何更改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)
于 2013-11-14T18:45:12.047 回答
3

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

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

或者

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

self.bar是一个实例属性(设置总是直接发生在对象上)。但是因为没有baz实例属性,self.baz而是找类属性。

于 2013-11-14T18:45:22.597 回答