8

私がこれを書いているとき、私が実際にこの問題を経験していることは、ほとんど非現実的なことのように思えます。

オブジェクトのリストがあります。これらの各オブジェクトは、Individual私が作成したクラスのインスタンスです。

したがって、社会通念はそれisinstance(myObj, Individual)が戻るべきだと言いTrueます. しかし、そうではありませんでした。だから私は自分のプログラミングにバグがあると思って、type(myObj)を出力しinstanceましmyObj.__class__Individual

>>> type(pop[0])
<type 'instance'>
>>> isinstance(pop[0], Individual) # with all the proper imports
False
>>> pop[0].__class__
Genetic.individual.Individual

私は困惑しています!何を与える?

編集:私の個人クラス

class Individual:
    ID = count()
    def __init__(self, chromosomes):
        self.chromosomes = chromosomes[:]    # managed as a list as order is used to identify chromosomal functions (i.e. chromosome i encodes functionality f)
        self.id = self.ID.next()

    # other methods
4

2 に答える 2

14

このエラーは、Individualクラスが何らかの理由で2回作成されたことを示しています。pop[0]の1つのバージョンで作成しInstance、たとえば他のバージョンでチェックしています。それらはほとんど同じですが、Pythonはそれを認識せず、isinstance失敗します。これを確認するには、pop[0].__class__ is Individualfalseと評価されるかどうかを確認します。

reloadモジュールは1回だけインポートされ、すべてのクラスオブジェクトは事実上シングルトンのままであるため、通常、クラスは2回作成されません(を使用しない限り)。ただし、パッケージと相対インポートを使用すると、モジュールが2回インポートされるというトラップが残る可能性があります。これは、スクリプト(で始まるpython bla別のモジュールからインポートされるのではなく、で始まるimport bla)に相対インポートが含まれている場合に発生します。スクリプトを実行するとき、Pythonはインポートがパッケージを参照していることを認識しないため、インポートを絶対として処理し、独自のクラスを持つGeneticトップレベルモジュールを作成します。別の他のモジュールは、最終的にインポートするパッケージを正しくインポートします。これにより、ドッペルゲンガーが作成されます。individualindividual.IndividualGeneticGenetic.individualGenetic.individual.Individual

この問題を解決するには、スクリプトで絶対インポートのみを使用するようにします。たとえば、import Genetic.individualのような相対インポートがimport individual正常に機能しているように見える場合でも同様です。また、入力を節約したい場合は、を使用してimport Genetic.individual as individualください。また、古いスタイルのクラスを使用しているにもかかわらず、isinstance新しいスタイルのクラスよりも古いため、引き続き機能することに注意してください。そうは言っても、新しいスタイルのクラスに切り替えることを強くお勧めします。

于 2012-10-23T21:02:20.697 に答える
1

から継承する新しいスタイルのクラスを使用する必要があります

class ClassName(object):
    pass

あなたの例から、あなたはから継承する古いスタイルのクラスを使用しています

class Classname:
    pass

編集: @ user4815162342 が言ったように、

>>> type(pop[0])
<type 'instance'>

古いスタイルのクラスを使用していることが原因ですが、これは の問題の原因ではありませんisinstance。代わりに、複数の場所でクラスを作成しないようにするか、作成する場合は個別の名前を使用する必要があります。複数回インポートしても問題ありません。

于 2012-10-23T20:54:09.757 に答える