2017-07-07 98 views
1

我在Python中編寫了一個函數,該函數應該與Java中的工廠類似,因爲它爲給定參數實例化正確的類並返回此實例。返回函數內部類的Python對象實例

僅具有一個在函數內部類的最小的例子是這樣的:

def create_object(param): 

    class SpecialClass(ParentClass): 
     def func(self, param): 
      doSomething() 

    class_instance = SpecialClass(param) 
    return class_instance 

當我調用此函數從外部我可以完美地使用該對象。從Java背景來看,我認爲這與Python中的動態類型有關,但我仍然不確定爲什麼這會起作用。函數本身中的類是不是已知的範圍?

+0

你的問題不清楚。爲什麼*不會工作?爲什麼這與動態輸入有關呢? –

+0

是的,它與動態輸入有什麼關係?另外,@DanielRoseman,他意味着在Java中,函數內類和對象的範圍只在內部......但弗洛裏安說,它似乎並不是這種情況 –

+1

我仍然看不到這與範圍有什麼關係。你從函數返回一個對象,並且該對象可以傳遞到任何你喜歡的地方,甚至在Java中。 –

回答

3

要回答你的問題,你已經返回了一個對象,Python會讓你使用它,而不管原始類的定義在哪裏。在Python中沒有私有類,函數本身就是對象,所以基本上當你返回對象時,該函數外的所有東西都將該對象視爲create_object.SpecialClass的一個實例。

實際上,雖然工廠不是你在Python中做的東西。你應該使用一個只會返回類實例的類方法。你可以在這裏閱讀更多關於它:https://docs.python.org/3/library/functions.html#classmethod

如果你感到困惑只是谷歌python classmethod decorator,並有一些很好的如何使用它們的Stackoverflow解釋。

+0

這不是他所問。他想知道它做了什麼,也就是說,使用範圍有限的內部類的對象。爲什麼這樣做? –

+0

@AakashVerma,我已經更新瞭解釋,但我仍然保持製造工廠的灰心,因爲它是不可辯駁的 –

+0

我有一半希望聽到這一點,我真的很高興你告訴我。我會看看是否可以在清除工廠功能的同時將我的代碼更改爲現在的可讀性。至於其餘的,我認爲這回答了我的問題。謝謝! – Florian

-2

原諒我糟糕的Java,但我看不到你的Python代碼是如何從這個有什麼不同:

class NestedScope { 
    public static void main(String[] args) { 
     OuterClass oc = new OuterClass(); 
     oc.bar().foo(); 
    } 
} 

class OuterClass { 
    class InnerClass { 
    public void foo() { 
     System.out.println("in here"); 
    } 
    } 
    public InnerClass bar() { 
    return new InnerClass(); 
    } 
} 

在這裏,我引用類的將InnerClass的對象,而這個類中曾經是主要的類範圍,我可以成功地調用它的方法foo()

+0

如果我正確地獲得了區別,您將無法通過該方法直接調用foo(),儘管沒有您的間接方向。那是因爲如果你的NestedScope類不知道它,你不能聲明InnerClass類型的對象。爲此,您還必須導入InnerClass。然而,在Python中,我沒有(我想我不能?)甚至在我的函數中導入該類。 所以是的,我確實看到了不同。 – Florian

+0

您的代碼是[here](https://ideone.com/eOE5iW),它的工作原理與我們所談論的完全不同。在函數之外創建類的外部對象,它位於外部類的函數內,而不是代碼所描述的情況。這不可能發生,男人。您的代碼是關於通過函數創建並返回內部類的對象,當類不在同一上層類中的某個函數內時。而不是在外面創建一個函數內部的類的對象。 –

+0

如果必須在函數內部創建類的對象,則需要在同一個函數內創建它,並且不能傳遞它。也許使用該內部類創建一個到外部類的字段的getter,然後創建一個對象並調用getter。所有這些都發生在內部類存在的函數中。 –