2017-08-23 22 views
-1

假設我們有一些在全局名稱空間中定義和可用的類。在例如:如何調用具有文本變量名稱的類構造函數? [Python]

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

class Vector: 
    def __init__(self, alpha, r): 
     self.x = r * cos(alpha) 
     self.y = r * sin(alpha) 

# and many others... 

如何做到這一點:

class_name = 'Point' 
x = 14.361 
y = -8.100 
code_str = 'class_object = ' + class_name + '(' + str(x) + ', ' + str(y) + ')' 

exec code_str # That evaluates to: "class_object = Point(14.361, -8.100)" 

print class_object.x, class_object.y 

,而無需使用危險的高管?

PS。如果有人要求,我打算從一些txt或json文件加載數據。

+0

加載什麼數據,要執行的字符串?看起來不好主意。 –

+0

你根本不需要'exec'。只需從你的文本文件中加載數據,並將其傳遞給'Point'類構造函數。簡單。 –

+0

我知道,從文件執行代碼是非常糟糕的想法:)但我有很多類 - 點,線,Versor,我不知道哪一個我會打電話 –

回答

1

,你可以使用類似:

globals()[class_name](x, y) 

如果你有很多類來處理,你應更好地利用dictionnary來存儲它們,關鍵是名字,值是類,

那麼你就可以把它叫做:

my_classes = {'Point' : Point, 'Point2' : Point2} 

class_name = 'Point' 
x = 14.361 
y = -8.100 
my_classes[class_name](x, y) 
2

如果在全局名稱空間中定義了一個類(或導入到)中,則可以通過globals()字典獲取對該類的引用。之後,只需調用它通常的方式:如果類中定義或在同一模塊的進口

class_name = "Point" 
args = {"x": 14.361, "y": -8.100} 
Point = globals()[class_name] 
class_instance = Point(**args) 
-1

您可以使用eval。

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

class Vector: 
    def __init__(self, x, y): 
     self.x = x+100 
     self.y = y+100 

class_name = 'Vector' 

x = 10 
y = 20 
caller = '{}({},{})'.format(class_name,x,y) 
ob = eval(caller) 

print ob.x, ob.y 
相關問題