2017-02-14 16 views
0

私はPythonを初めて使い、クラスとその属性についてPython 2.6で質問します。Pythonのクラスと属性のタイプを定義する

私はこのようなクラスNodeを考えてみましょう:私は今、新しいグラフを作成し、いくつかのノードを追加する場合

class Graph: 
    nodeList = Node 
    edgeList = Edge 

    def __init__(self,nodeList,edgeList): 
     self.edgeList = edgeList 
     self.nodeList = nodeList 

    def getNodes(self): 
     return self.nodeList 

    def setNodes(self,nodeList): 
     self.nodeList = nodeList 

    def addNode(self,n): 
     if type(n) == list: 
      self.nodeList.extend(n) 
     else: 
      self.nodeList.append(n) 

:このような

class Node: 
    x = int 
    y = int 
    neighbours = [] 
    discovered = bool 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 

    def setNeigbours(self,neighbours): 
     self.neighbours = neighbours 

    def addNeighbours(self,n): 
     if type(n) == list: 
      self.neighbours.extend(n) 
     else: 
      self.neighbours.append(n) 

    def isDiscovered(self): 
     return self.discovered 

    def setDiscovered(self,discovered): 
     self.discovered = discovered 

とクラスGraph

n1 = Node(0,0) 
n2 = Node(1,1) 
g = Graph([],[]) 
g.addNode(n1) 
g.addNode(n2) 

私は以下を期待します。print<Type 'Node'>:私はそれを実行したときに

for n in g.nodeList: 
    print type(n) 

はしかし、私が取得:

<type 'instance'> 
<type 'instance'> 

のPythonを指示する方法は、nodeListは、リスト、唯一Node -Elementsが含まれていること、ありますか?

答えて

0

これはどれもPythonを書く方法ではありません。代わりにJavaのように見えます。

クラスレベルで属性を宣言する必要はありません。それを行う唯一の理由は、すべてのインスタンスで共有されている値を使用することです。インスタンスの属性ですぐに上書きするため、実行していない値が使用されます。これらの定義を削除します。

getterメソッドとsetterメソッドを記述することは、特に属性を返すだけの場合には、非常に独立しています。呼び出しコードは属性に直接アクセスする必要があります。

あなたの質問には、Python 2 [*]を使用しているので、クラスはオブジェクトから継承する必要があります。その場合、正しいタイプが表示されます:

class Graph(object): 
    ... 

g = Graph() 
type(g) # module.Graph 

(*)注意、実際には2.6を使用しないでください。それは古く、サポートされていません。あなたが2.xに固執している場合、少なくとも2.7を使用してください。実際には3.xを使用してください。それ以外は何も元の問題を修正します。

1

確かに、あなたが最新のバージョンのPythonを使っているのであれば(これは、執筆時点では3.6.0です)、

from typing import List 

class Graph: 
    nodeList: List[Node] 

のPython自体は、実際に情報を何もしませんが、静的解析を実行し、あなたがリストにNode以外の何かを置くしようとした場合を教えてくれるPython用型チェックツールがあります。あなたはその後、同じチェックを行うことができるようになりますfomattedコメントや型チェックツールと似た何かを行うことができますPythonの3の古いバージョンで

from typing import List 

class Graph: 
    nodeList # type: List[Node] 

もちろん、このすべては、オプションの静的型チェックを提供しますプログラムを実行する前にあなたのコードが実行されると、Pythonは適切なメソッドと属性を持っている限り、オブジェクトの型については気にしません。もしそれがダックのようなものなら、Pythonはそれをアヒルとして扱います。

あなたはhttp://mypy-lang.org/

見るあなたのNode型のインスタンスを印刷するあなたに<type 'instance'>を与えるという事実をPythonで、オプションの静的型チェックについての詳細をお知りになりたい場合は、あなたがの切り替えを検討してくださいPythonの2のいくつかのバージョンを使用していることを示していますすべての可能であれば新しいバージョンに、非常に少なくとも、あなたは、Python 2を続行したい場合は、あなたのすべてのオブジェクトを明示的にobjectから派生していることを確認してください:

class Node(object): 
    ... 

これを行うとprint文が表示されることあなたはcラス。そうしないと、Pythonの非常に初期の古いスタイルのクラスが得られ、プロパティのようなものは正しく動作しません。

0

Pythonが動的に型指定されているため、Pythonで型を強制する方法はありません。

可能な解決策は、実行時にインスタンスの種類を確認することです。

まず、objectからクラスを継承します(つまり、 '新しいスタイル' オブジェクト):

class Node(object): 
    # your code here 

class Graph(object): 
    # your code here 

そして、あなたは、実行時に型チェックを行うことができます。

>>> g = Graph() 
>>> type(g) 
<class '__main__.Graph'> 
>>> isinstance(g, Graph) 
True 
0

Pythonは動的型付けされた言語。変数を使用する前に宣言する必要はなく、型を宣言する必要もありません。

あなたはこのようなものを行うことができます。

foo = 1 # this is an integer 
foo = "string" # this is a string 

変数fooがそれに保存されている値の型を持っています。

異なるタイプのオブジェクトを同じリストに格納することができます。格納するタイプを1つのみ強制する場合は、組み込みのlistクラスをサブクラス化できます。

関連する問題