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加えた変更はインスタンスのスコープ内にのみ反映され、 の別のインスタンスを作成しても. を使用すると、その変数に加えた変更は、そのクラスのインスタンスに伝播されます。SimpleStringselfpopSizeSimpleString popSize1000SimpleString.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

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代わりにクラス属性を検索します。

于 2013-11-14T18:45:22.597 に答える