2014-11-03 81 views
-1

這很可能之前已經被問過了,但我不確定我所看到的問題具有完全相同的情況。返回一個變量的名稱而不是其對象引用代碼

我有一個跟蹤光線的程序。每條光線都是一個物體,每個透鏡都是一個物體。如果當用戶試圖使用該方法通過鏡頭傳播光線時,該光線實際上並不通過鏡頭,我希望程序告訴用戶這一事實。

僞代碼:

class OpticalElement: 
    ... 
    def propagate_ray(self): 
     if intersect: 
      calculate new direction etc 
     else: 
      print "Ray %s did not intersect optical element" % (ray) 

使得

>> A = Ray(args) # won't intersect lens1 
>> B = Ray(different args) 
>> lens1 = OpticalElement(args) 
>> lens1.propagate_rays(A, B) 
'Ray <Ray instance at 0x7688> did not intersect optical element' 

誰知道哪個射線即當存在被傳播的光線50?我想要它輸出:

'Ray A did not intersect optical element' 
+1

你不能那樣做;對象不會跟蹤引用它們的名稱。 – 2014-11-03 18:38:06

+0

一個對象可以有許多不同的變量引用它們。你應該給你的對象'name'屬性。 – Borodin 2014-11-03 18:40:08

+0

如果電話是'lens1.propagate_rays(Ray(args),Ray(不同的參數))',你會顯示什麼? – chepner 2014-11-03 18:40:47

回答

1

你不能那樣做;對象不會跟蹤引用它們的名稱。

任何對象都可以有1到無限的名稱或引用它們的其他對象,所以如果有多個對象被列表或字典引用,您會選擇什麼名稱?或者,如果您將直接lens1.propagate_rays(Ray(args), Ray(different_args))合併到您的方法中,那該怎麼辦?

你能做的最好是給你的對象的名稱屬性,則引用的對象__repr__

class Ray: 
    def __init__(name, *other_args): 
     self.name = name 

    def __repr__(self): 
     return '<Ray({!r}, ....>'.format(self.name) 
+0

好吧,這是值得一試。事實上,這爲我清除了類似問題的答案中發生了什麼。 – binaryfunt 2014-11-03 18:44:09

+0

另外,我試圖用一個簡潔的例子,因爲我發現其他人感到困惑 – binaryfunt 2014-11-03 18:51:34

0

一個對象可以有指他們很多不同的變量。你應該給你的對象name屬性。

相關問題