2016-05-22 3 views
0

タイプと見なされるものを理解しようとしています。タイトルと同様に、あるクラスから2つのオブジェクトを作成する場合、それらは同じタイプと見なされますか?ビッタータイプ?クラスは一意のID、データフィールド(インスタンス変数)、および動作(インスタンスメソッド)を持つオブジェクトを作成するので、それにもかかわらず、クラス内でインスタンス化されたインスタンスは、データフィールドと動作に関して同様の特性を持つため、ある特定のクラスで作成されたオブジェクトはそのクラスの型ですか?プログラマがクラス(例えばクラスBitter)を設計する場合、そのクラスから作成されたオブジェクトはBitter?

この質問がまだ理にかなっていない場合、私は、Pythonの紹介の練習が私に求めていることを理解しようとしています。だからここに質問があります: x座標とy座標を持つ点を表すPointという名前のクラスを設計します。クラスには、 .... .... .aメソッドこのポイントからポイントタイプの別のポイントまでの距離を返します。

問題は、このクラスは一度に1つのインスタンスしか取りませんが、命令は2つの点(x1、y1、x2、y2)を要求しています。だからクラスの外に私がクラスが返すものを格納していた場合、2つの型はPoint型と見なされますか? 例:

class Point: 
    def __init__(self,x,y): 
     self.__x = x 
     self.__y = y 

    def distance(thisPoint): 
     #additional code that does what the instructions specify 
     return distanceFromThisPointToAnother 
def main(): 
    x1,y1,x2,y2 = eval(input("Enter two points: ")) 
    p1 = point(x1,y1) #Would this variable be considered point type 
    p2 = point(x2,y2) #Would this variable be considered "another point of Point type" 

答えて

0

「type」、「kind」、「instance」、「class」のような厳密な定義があります。これは学術的なケースで特に非常に表現力のあるタイプの言語に適用できます。したがって、型システムが故障する学術的なケースがあるかもしれません。 (例えば、Liskov substitutionを壊すPointのサブクラスは、Pointの "型"とはみなされないかもしれません)。実際には、この種の(大体の)大文字小文字のPythonでは、それを "型"と呼ぶのが妥当です。

私は割り当てが言っていることは、同じデータを表すことができる他の構造をPointのインスタンスとしてサポートする必要がないということです。たとえば、ポイントとタプルの間の距離を記述できるコードを記述することができます。 タイプをサポートする操作を許可する場合は、必要なタイプとしてを扱います。これは、duck typingです。これはPythonのかなり慣用的な部分です。私はあなたの仕事は明示的にあなたがこの運動のためにそれをする必要はないと言っていると思います。

0

はい。

class Bitter(object): 
    pass 

print(Bitter().__class__) # <class '__main__.Bitter'> 
print(type(Bitter()))  # <class '__main__.Bitter'> 
print(type(Bitter()) == Bitter)  # True 
print(isinstance(Bitter(), Bitter)) # True 

しかし、サブクラスが関与物事が少し変更されている場合:

:のように呼ばれる

def distance(self, other_point): 

、その後:あなたのケースでは

class ReallyBitter(Bitter): 
    pass 

print(type(Bitter())) # <class '__main__.ReallyBitter'> 
print(isinstance(ReallyBitter(), Bitter)) # True 

の方法はこれのように定義する必要があります

p1.distance(p2) 

おそらくオブジェクト上のメソッドを呼び出すと、self引数が暗黙的に渡されるという事実から混乱が生じます。 selfは特別なキーワードではないことに注意してください。私は、メソッドが呼び出されているクラスのインスタンスを参照する、クラス内の通常のメソッドの最初の引数を意味します。

+0

pythonのpep8ドキュメントは、オブジェクトの型を明示的にチェックするためにtype()よりisinstance()を好むことに注意してください。 –

+0

@TomBarronよくありません... "明示的にオブジェクトの型をチェックする" **何かが**インスタンス**であるかどうかを明示的にチェックする* *型の場合、明らかに 'isinstance'を使用します。 –

+0

@ Tadhgあなたは私を持っています。 :)私は、pep8は、 "オブジェクト型の比較では、型を直接比較するのではなく、常にisinstance()を使用する必要があります。たぶん私はちょうどそれを初めて引用したはずです。 –

1

「Pointオブジェクト」または「Point インスタンス」という用語が使用されていると思います。

あなたPointクラスはPythonでtypeオブジェクトのインスタンスである意味、typeです:

>>> isinstance(Point, type) 
True 

あなたの実際のポイントがtypeオブジェクトではありません。

>>> isinstance(p1, type) 
False 

しかし、それはインスタンスでありますPoint

>>> isinstance(p1, Point) 
True 
あなたの運動の質問に関して

、あなたは試してみました/考えられていない可能性があります一つのことは、メソッドは、引数として他のポイントを取ることができるということです。

def distance(thisPoint,otherPoint): 
     if not isinstance(otherPoint, Point): 
      raise TypeError("argument must be a Point") 
     # do calculation here! 
     NotImplemented #for this demo 

次にあなたがの両方を使用する方法を使用することができます引数として1、その他のメソッドを使用してポイント:

distance = p1.distance(p2) 

あなたの代わりにp2上のメソッドを使用するとsを得ることができる問題ではありませんポイントの順序を仮定すると、雨結果:

distance = Point.distance(p1, p2) 

これらのすべての3つはあなたに同じを与えるだろう:あなたは、クラスから直接メソッドを使用し、それはあなたにクリーンなコードを思わ場合は、引数として両方のポイントを指定することができ

distance = p2.distance(p1) 

結果

+0

この問題彼らはgetメソッドを表す2つのプライベートデータフィールドxとyを持つようにクラスを指定しています。私は私の質問のコードのようにそれを書いた –

+0

だから? 'otherPoint .__ x'は' Point'クラスのメソッドで書かれていれば正常に動作します... –

関連する問題