2016-03-24 12 views
-1

Kann ein Objekt bei der Initialisierung auf None gesetzt werden, aber trotzdem zu einer Klasse gehören?Ein Objekt einer bestimmten Klasse als None definieren

class Foo: 
    def do_stuff(): 
     pass 

bar_1 = Foo() 
bar_2 = None 

Der spezifische Zweck ich im Sinne habe, ist, dass ich bar_2 accross verschiedene Module zur Verfügung stehen soll, aber es zu einem späteren Zeitpunkt (aus Gründen, die nicht relevant sind) zu definieren. Es funktioniert gut, wenn Sie den Code ausführen. Meine IDE weiß jedoch nicht, dass bar_2 vom Typ Foo ist, und zeigt mir daher nicht do_stuff() als Autocomplete-Option, wie es zum Beispiel für bar_1 tut.

Ich verstehe, dass Python nicht eine stark typisierte Sprache ist, aber ich denke, wenn es eine Möglichkeit, Python zu sagen war, dass bar_2 vom Typ Foo, es würde das Problem der die automatischen Vervollständigung löst nicht angezeigt.

Wenn es eine andere Möglichkeit gibt, meine IDE (speziell PyCharm) auf die Klasse bar_2 aufmerksam zu machen, würde ich mich freuen zu wissen.

+0

Was soll bar2 sein? –

+0

In Ihrem aktuellen Code ist 'bar_2' nicht vom Typ' Foo'. Wenn Sie möchten, dass es "Foo" ist, müssen Sie es so definieren. Wenn Sie die Initialisierung verzögern müssen, erstellen Sie eine andere Methode als "__init__", die die Aktionen ausführt, die Sie verzögern möchten, und rufen Sie sie dann auf, wenn sie bereit sind. – ChrisP

Antwort

1

Wenn Sie Python 3.5 verwenden, können Sie type hinting verwenden. Für diese spezielle Anwendung müssen Sie es in einem type comment setzen:

bar_2 = None # type: Foo 

Früheren Versionen von Python keine eingebaute Möglichkeit, dies zu tun haben, obwohl ich nehme eine IDE, die sowohl frühere und spätere Versionen unterstützt der Sprache kann Typkommentare erlauben, ihr Verhalten zu beeinflussen, auch wenn die von Ihnen verwendete Python-Version die vollständige Typhinweis-Semantik nicht unterstützt.

0

, wenn angenommen wird, eine Instanz von foo sein, Sie

assert isinstance(bar_2,Foo) 
# anything below this and in scope will autocomplete bar_2 with Foo's methods 

Im Allgemeinen tun kann dies nicht eine sehr gute Praxis ist, und sollte vermieden werden, aber es funktioniert die automatische Vervollständigung in meisten IDE zu ermöglichen (pycharm enthalten)

1

Versuchen Sie type hints unter der Annahme, dass der Typ konsistent ist und Sie Python 3.5 verwenden.

Um die Intellisense-Vervollständigung zu erhalten, hat JetBrains ein legacy type Hinting-System, das für alle Versionen von Python funktionieren sollte.

+0

gute Antworten :) (obwohl die Chance, dass er Python3.5 ist dünn) (ich hatte keine Ahnung von dem Legacy-Typ Hinting Zeug und es ist immer cool, neue Sachen zu lernen) –

+0

Guter Punkt, ich werde eine Klarstellung hinzufügen. –

Verwandte Themen