2016-12-16 9 views
4

私はPythonでオブジェクト指向プログラミングを学ぼうとしています。これを行うには、線の傾きを計算するメソッドを作成する必要があります。これは、原点を点に結合します。私は原点が(0,0)であると仮定しています。例:Pythonでスロープを計算する方法

Point(4, 10).slopeFromOrigin() 
2.5 
Point(12, -3).slopeFromOrigin() 
-0.25 
Point(-6, 0).slopeFromOrigin() 
0 

そして、式slope = (Y2 - Y1)/(X2 - X1)を使用して傾きを計算しています。また、0で割ることはできないので、メソッドが失敗したときにはNoneを返す必要があります。

class Point: 

#Point class for representing and manipulating x,y coordinates 

    def __init__(self, initX, initY): 

#Create a new point at the given coordinates 

     self.x = initX 
     self.y = initY 

    def getX(self): 
     return self.x 

    def getY(self): 
     return self.y 

    def distanceFromOrigin(self): 
     return ((self.x ** 2) + (self.y ** 2)) ** 0.5 

#define a method called slopeFromOrigin here 

    def slopeFromOrigin(self): 

#set origin values for x and y (0,0) 

     self.x = 0 
     self.y = 0 

#slope = (Y2 - Y1)/(X2 - X1) 

     if (Point(x) - self.x) == 0: 

      return None 

     else: 

      return (Point(y) - self.y)/(Point(x) - self.x) 

#some tests to check our code 

from test import testEqual 
testEqual(Point(4, 10).slopeFromOrigin(), 2.5) 
testEqual(Point(5, 10).slopeFromOrigin(), 2) 
testEqual(Point(0, 10).slopeFromOrigin(), None) 
testEqual(Point(20, 10).slopeFromOrigin(), 0.5) 
testEqual(Point(20, 20).slopeFromOrigin(), 1) 
testEqual(Point(4, -10).slopeFromOrigin(), -2.5) 
testEqual(Point(-4, -10).slopeFromOrigin(), 2.5) 
testEqual(Point(-6, 0).slopeFromOrigin(), 0) 

あなたが見ることができるように、私たちはx2のようにポイントの最初のパラメータが必要であることを言うしようとしている、とポイントの2番目のパラメータがy2とする:ここに私が試したものです。このように試してみました。

NameError: name 'y' is not defined on line 32です。

私はまた、このようなポイントのインデックス値を取得しようとした:

return (Point[0] - self.y/(Point[1] - self.x)

をしかし、それはまた、私のエラーメッセージました:

TypeError: 'Point' does not support indexing on line 32

を私はどのようにわかりませんxおよびyパラメータの値をPointから取得して、メソッドがテスト時に機能するようにします。あなたの提案があれば教えてください。ありがとうございました。

+0

は良いアイデアではありません。エラーを起こさせてみませんか? – Blender

+1

あなたのメソッドで 'self.x'と' self.y'を0に設定しているのはなぜですか?それは意味をなさない。それがどういう意味か考えてみてください。 –

+0

@Blenderこれは明らかに割り当てです。 getterとsetterを使うことは良い考えではありません。 –

答えて

5

まず問題

self.x = 0 
self.y = 0 

あなただけの原点に現在のポイントを設定します。それをしないでください。したがって、原点からの距離は0 ...

第2の問題Point(x)Point(y)は、self.xself.yの値を取得する方法ではありません。

次に、スロープは単に「ライズオーバー」です。さらにself.x == 0の場合は、Noneを返信してください。

だから、単に

def slopeFromOrigin(self): 
    if self.x == 0: 
     return None 
    return self.y/self.x 

あるいは

def slopeFromOrigin(self): 
    return None if self.x == 0 else self.y/self.x 

やPythonが

def slopeFromOrigin(self): 
    if self.x != 0: 
     return self.y/self.x 

独自にNoneを返してみましょう私はあなたの混乱はあなたが考えることであると思いますあなたは何とか "起源"を定義する必要があります。あなたがそれを行うために必要な場合は、代わりに、これは

origin = Point(0,0) 
Point(-6, 0).slopeFromPoint(origin) 
+0

私は予想よりずっと簡単です。ヘルプ/説明をありがとう。 – Sean

+0

self.yとself.xがどのように上昇して実行されるのか説明してください。 – Sean

+0

'self.y'ステップを「上昇」(上/下に移動)、' self.x'ステップを「実行」(右/左に移動)に移動します。ネガティブ/ポジティブは方向を選択します。 –

2
 if (Point(x) - self.x) == 0: 

     return None 

    else: 

     return (Point(y) - self.y)/(Point(x) - self.x) 

As you can see, I'm trying to say that we need the first parameter of Point to be x2, and the second parameter of Point to be y2. I tried it this way and got

NameError: name 'y' is not defined on line 32.

あなたがまだ割り当てられていないグローバル変数であるyの値にアクセスしようとしている必要があります。

I also tried to get the index values of Point like this:

return (Point[0] - self.y/(Point[1] - self.x)

2つの問題:

  1. "点" クラスではなく、(オブジェクトのインスタンスである)オブジェクトです。
  2. 代わりにオブジェクトを配置しても、Pointはリストのようなオブジェクトではありません。 variableName[index]のようなインデックスを使用してアイテムにアクセスするには、variableNameのクラスに__getitem__(self, key)の実装が必要です。例:呼び出しが失敗したときに `NONE`を返す

    >>> class GoodListClass: 
    ...  def __init__(self, list): 
    ...   self.myList = list 
    ...  def __getitem__(self, key): 
    ...   return self.myList[key] 
    ... 
    >>> class BadListClass: 
    ...  def __init__(self, list): 
    ...   self.myList = list 
    ... 
    >>> someList = range(10) 
    >>> goodListObject = GoodListClass(someList) 
    >>> badListObject = BadListClass(someList) 
    >>> print(goodListObject[2]) 
    2 
    >>> print(badListObject[2]) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    AttributeError: BadListClass instance has no attribute '__getitem__' 
    
+0

2番目の説明は理にかなっています - なぜself.yとself.xは(y2 - y1)と(x2 - x1)を自動的に表すのですか? – Sean

+0

これらは(少なくともあなたの実装のために)あってはなりません。あなたはその思いをどう思いついたのか説明できますか? – Caladbolgll

+0

cricket_007によって与えられた答えに基づいて、self.x == 0 else self.y/self.xならばNoneを返します。彼は単純にself.y/self.xを使用して斜面を取得しました。 – Sean

関連する問題