2

このウェブページから Python を学んでいます (中国語ですが、コードに注目してください)。そして、Windows 7 で Python 2.7.3 を使用して自分でコードを練習したいと考えています。しかし、オブジェクト名に非常に奇妙なエラーが見つかりました。 . コードは次のとおりです。

class Person:
    '''Represents a person.'''
    population = 0

    def __init__(self, name):
        '''Initializes the person\'s data.'''
        self.name = name
        print '(Initializing %s)' % self.name

        # When this person is created, he/she
        # adds to the population
        Person.population += 1

    def __del__(self):
        '''I am dying.'''
        print '%s says bye.' % self.name

        Person.population -= 1

        if Person.population == 0:
            print 'I am the last one.'
        else:
            print 'There are still %d people left.' % Person.population

    def sayHi(self):
        '''Greeting by the person.
       Really, that\'s all it does.'''
        print 'Hi, my name is %s.' % self.name

    def howMany(self):
        '''Prints the current population.'''
        if Person.population == 1:
            print 'I am the only person here.'
        else:
            print 'We have %d persons here.' % Person.population

David = Person('David')
David.sayHi()
David.howMany()

kalam = Person('Abdul Kalam')
kalam.sayHi()
kalam.howMany()

David.sayHi()
David.howMany()

これらのコードを実行すると、このエラー レポート (最後の 2 行) が表示されました。しかし、オブジェクト変数「David」を「Swaroop」またはその他の名前に置き換えると、コードは正常に機能します。これがどのように起こるかわかりません。

(Initializing David)
Hi, my name is David.
I am the only person here.
(Initializing Abdul Kalam)
Hi, my name is Abdul Kalam.
We have 2 persons here.
Hi, my name is David.
We have 2 persons here.
Abdul Kalam says bye.
There are still 1 people left.
David says bye.
Exception AttributeError: "'NoneType' object has no attribute 'population'" in <bound method Person.
__del__ of <__main__.Person instance at 0x00000000026D91C8>> ignored
4

3 に答える 3

2

__del__()インタープリターのシャットダウン中にメソッドが呼び出されると、例外が発生します。その時点で何かが利用可能であるとは限りません。あなたの場合、Person変数はすでに破棄されているように見えます。この問題を無視するか、使用を中止する必要があります__del__()

于 2013-04-02T09:34:13.273 に答える
1

呼び出されない例を示す__del__には:

class Referencer(object):
    def __init__(self, name):
        self.name = name

    def __del__(self):
        print("__del__ {}".format(self.name))

foo = Referencer('foo')
bar = Referencer('bar')
baz = Referencer('baz')
foo.x = bar
bar.x = foo

del foo
del bar
del baz

次のような出力が期待されます。

__del__ foo
__del__ bar
__del__ baz

(少なくとも Python 2.7 では) 次のようになります。

__del__ baz
于 2013-04-03T09:36:02.670 に答える