2012-09-04 91 views
1

我目前正在爲python編寫大量自定義公司工具的包裝器。Python類繼承自所有子模塊

我基本上將打破每個工具到它自己的py文件與包含對該工具的調用作爲一種方法的類。 這些將全部包含在一個包中。

然後會有一個主類,它將從包中導入所有內容,然後從每個類繼承,以顯示爲一個內聚類。

masterClass.py 

pyPackage 
- __ init__.py 

- module1.py 
--class Module1 
---method tool1 

- module2.py 
--class Module2 
---method tool2 

etc 

現在,我autogenerating主類文件,從包的模塊繼承,但我不知道是否有一個更優雅的方式來做到這一點?

from package import * 
class MasterClass(package.all): 
    pass 
+0

這聽起來像Java而不是Python代碼。例如。在Python中,你沒有'all'模塊(並且如果你想要一個'all'模塊,你可以使用'__init __。py')而你描述的是mixin。 – dav1d

+0

抱歉,意味着導入*不是全部導入 與__init__中定義的__all__ –

+0

然後沒有辦法做到這一點(如果你用'dir()'和'eval'忽略黑客)。 – dav1d

回答

0

我真的不知道你是什麼原因對試圖從所有其他較小的類創建一個更大的master類繼承,但是,想到的第一件事是,設計可能會倒退。

您可能想要做的事情是擁有一個基類,您的所有命令模塊都可以繼承基類。可以使用包作爲智能名稱空間用於收集類似的功能,如「網絡」或「壓縮」等

class ToolBase(object): 
    # common functionality here 

    # class attributes 

    # base constructor 

    # methods: static, class, instance 

    pass 


class Module1(ToolBase): 

    def __init__(self): 
     super(Module1, self).__init__() 

class Module2(ToolBase): 

    def __init__(self): 
     super(Module2, self).__init__() 

在該基類的例子,每個子類可以預期ToolBase的功能,以在那裏,包括任何從數據庫連接,套接字,資源等構造函數中進行設置。

也許一個項目結構是這樣的:

pyPackage 
    __init__.py 
     # class ToolBase 
     # __all__ = ['network', 'compress'] 
    network/ 
     __init__.py 
     module1.py 
      # class Module1 
    compress/ 
     __init__.py 
     module2.py 
      # class Module2 

更新

的方式來使用的基類,有一個共同的「端口」對象,你可以把一個一流水平屬性,只是初始化一次:

class ToolBase(object): 
    _PORT = None 

    def __init__(self): 
     if self._PORT is None: 
      self._PORT = "PORT" 

    @property 
    def port(self): 
     return self._PORT 


class Foo(ToolBase): 

    def go(self): 
     print self.port 

現在你的類是有用的,並將共享端口對象。

+0

嗯,這是因爲每個函數都需要一個端口對象才能工作,但是該端口對象是在初始化時動態創建的。 因此,不是將端口傳遞給每一種方法,而是繼承所有這些端口(對我來說)更加清潔,然後只傳遞一次端口 –

+0

這聽起來不像它們應該是單獨的類。如果他們都依賴於一個端口對象,並且您正在創建主類中的端口對象...那麼它會使原始類自己抽象和無法使用。 – jdi

+0

他們永遠不會被自己使用。將它們分成單獨的課程的原因是爲了便於修改它們。 目前他們作爲一個非常大的類存在。 即。基本上我想將這一個大類py腳本拆分爲幾個較小的腳本,但保持最終可訪問性相同 –