【问题标题】:Why is Python class not recognizing static variable为什么 Python 类不能识别静态变量
【发布时间】:2013-11-14 18:43:58
【问题描述】:

我正在尝试用静态变量和方法(属性和行为)在 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 没有定义

【问题讨论】:

  • 必须始终使用self 访问属性,例如self.popSize
  • SimpleString.popSize ....当它是静态类变量时...(如果您通过自我更改访问它不会反映回类变量)
  • 你拼错了字母 ;-) GRAMMAR NAZI ftw
  • 尼克,加入我的this聊天室

标签: python class oop variables static


【解决方案1】:

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

selfSimpleString 之间的区别在于,如果您创建 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)

【讨论】:

    【解决方案2】:

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

    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反而找到了类属性。

    【讨论】:

    • 如果您想在一个类实例中修改它并查看其他类实例中反映的更改(如静态变量:P),也可以使用后者
    • @JoranBeasley:“静态变量”一词在这里确实放错了位置; Python 有“类属性”和“实例属性”。
    • 是的,但是类属性的行为类似于其他语言中的静态变量(大部分情况下)...
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2022-11-30
    • 2010-10-10
    相关资源
    最近更新 更多