2015-06-11 65 views
-1

我有一組類AB,C在「前端」包p1。它們都從p1.X繼承。python3:將字符串轉換爲

我有另一套類A,B,C在「後端」包p2。它們都從p2.Y繼承。

p1.X,我設置一個後端,以便p1.A使用p2.A作爲後端,p1.B使用p2.B等這種映射是基於在一個繼承的方法類名來完成。

現在,我認爲有,例如,backend = "p2.A"(字符串),但是當我嘗試評估這個,python不知道約p2,即使這是更早導入。

我做錯了什麼?我應該在eval內導入嗎?應該像意大利麪代碼...你有更好的主意嗎?

謝謝。

PS:我目前在「父」 p1.X類,這是可怕的是這樣的,但良好的澄清什麼,我想:

def getBackendClass(self): 
    myClass = ... # (class without package name) 
    if myClass == "A": 
      return p2.A 
    elif myClass == "B": 
      return p2.B 
    ... 
+0

爲什麼不映射'{classname:class}',然後使用'getattr'來訪問方法? – jonrsharpe

+0

感謝Jon,但我的目的是避免硬編碼。用你的榜樣,我應該有'{p1.A:p2.A,p2.B:p2.B,...}'(我有A,B,...等於或多或少30個不同的類別)。映射是系統化的(我使用vim腳本來編寫它...)。 –

回答

0

非常感謝。我做了所有的答案的混合,導致前端下面的代碼:

import backend 

class Parent: 
    @property 
    def backend_class(self): 
     return getattr(backend, self.__class__.__name__) 

class A(Parent): 
    pass 

if __name__ == "__main__": 
    instance = A() 
    backendInstance = instance.backend_class() 

評價關於用Cython:後端必須進口,而不是cimported,即使「純用Cython」 cdef類/ cpdef方法。

1

小哈克解決方案,但應該工作,而不是硬編碼。

p2.py:

class Y(object): 
    @classmethod 
    def fromString(cls, s): 
     cls_name = s.split(".")[1] 
     for c in cls.__subclasses__(): 
      if c.__name__() == cls_name: 
       return c() 
     raise ValueError("%s not found in subclasses" % s) 
1

也許你的意思是這樣?無論何時提取backend_class屬性,它都會調用它的__get__方法並返回該調用的結果。 BackendClassFetcher被稱爲非數據描述符。

包1/m1.py

from . import p2 

class BackendClassFetcher: 
    def __get__(self, obj, objtype): 
     return getattr(p2, objtype.__name__) 

class Parent: 
    backend_class = BackendClassFetcher()  
class A(Parent): pass 
class B(Parent): pass 
class C(Parent): pass 

for cls in [A,B,C]: 
    obj = cls() 
    print(cls, cls.backend_class, obj.backend_class) 

包1/m2.py

class Parent: pass 
class A(Parent): pass 
class B(Parent): pass 
class C(Parent): pass 
0

您可以使用import_moduleDocumentation

樣本:

from importlib import import_module 

path = "p2.A" 
cls_name = path.split('.')[-1] 
module_path = ".".join(path.split('.')[:-1]) 

module = import_module(module_path) 
cls = getattr(module, cls_name) 

好運。