2016-03-04 56 views
-1

例如:我可以調用子類從父類來創建對象

class parent(self): 
    def __init__(self, i): 
     self.i = i 
    def something(self, value): 
     a = child(value) 
     return a 

class child(parent): 
    def something_that_is_not_init(self): 
     return self.i 

子類繼承父類的初始化。所以我的問題是,在我的父類中,我可以創建一個子對象的實例,使用並返回它?

我會執行它如下:

a = parent(2) 
b = a.something(3) 

b.something_that_is_not_init() 
3 

編輯的問題了一下,更新的代碼段,因爲這個問題不明確。

+1

這將是非常糟糕的OOP設計。畢竟,'Child'已經有了一個很好的方法來實例化它。爲什麼'Parent'需要這樣一種方法?與每個班級有關的事情應該包含在他們所應用的班級中。 – kindall

+1

你想通過這樣做解決什麼問題? – IanAuld

+0

那就是我的想法,它是一個賦值,它明確地希望其中一個函數返回一個子類的實例。編輯:其實,我可能在我的問題中看起來過於簡單,除了創建並返回外,還有其他步驟需要執行。 – gptt916

回答

0

是的,它是有效的,但我不推薦它。它通常被認爲是糟糕的OOP編程。此外,你可以創建它作爲一個靜態方法,所以你永遠不必實例化父類。

class parent(): 
    def __init__(self, i): 
     self.i = i 

    @staticmethod 
    def foo(i): 
     c = child(i) 
     return c 

class child(parent): 
    def bar(self): 
     print("Lucker number {}.".format(self.i)) # just to show the parent __init__ function is called 

c = parent.foo(7) 
c.bar() #=> Lucky number 7. 
0

我只是想你的榜樣(包括一些失蹤self),並與python3至少它的工作原理:

class Parent(): 
    def __init__(self): 
     pass 

    def something(self): 
     a = child() 
     return a 

class Child(parent): 
    def something_that_is_not_init(self): 
     print('yes, you got me') 

並調用something方法的工作原理:

print(parent().something().__class__.__name__) 
# Child 
parent().something().something_that_is_not_init() 
# yes, you got me 

但也許這就是不是很好的設計。考慮一個工廠或使用__new__。但既然你明確表示你想要這樣的東西:它的工作原理,儘管我覺得它有點被寵壞了:-)

相關問題