2017-07-08 45 views
0

我想知道爲什麼我可以在運行時使用下面的代碼擴展類:爲什麼我通過類名初始化另一個類.__初始化在運行時擴展類__(個體經營)

class ClassA: 
    def __init__(self): 
     self.value = "1" 
     ClassB.__init__(self) 


class ClassB: 
    def __init__(self): 
     self.punk = "Punk" 


test = ClassA() 
print(dir(test)) 

這使我進入test.value和test.punk。但我不明白爲什麼。謝謝。

+1

__init__只是一個在創建對象時自動調用的方法,但它不會創建對象,它只是獲取對象並設置一些屬性。這就是爲什麼它不是問題。 – doratheexplorer0911

+1

請注意,在Python 2中有一個檢查來阻止它,但它們將它取出,因爲他們認爲它不值得擁有。 – user2357112

回答

2

ClassB.__init__不作任何使用self假定是實際上是ClassB一個實例,因此顯式調用它的ClassA一個實例是合法的,雖然有點古怪。這是不是真的有什麼不同比,如果你寫了

class ClassA: 
    def __init__(self): 
     self.value = "1" 
     punker(self) 

def punker(obj): 
    obj.punk = "Punk" 

punker是不是真的比ClassB.__init__太大的不同,一個事實就可以通過ClassB作爲

class ClassB: 
    __init__ = punker 
+0

感謝您的澄清。很明顯,我將這個對象傳遞給了ClassB,它將ClassA中的自我對象分配給了新的東西。完全錯過了。涼! – doom4

1

你沒有定義見更容易擴展ClassB,您剛剛在您的ClassA實例上執行了ClassB.__init__()方法。 Python並不妨礙你在點增加新的屬性,任何對象,案例:

class ClassA: 
    def __init__(self): 
     self.value = "1" 

test = ClassA() 
test.punk = "Punk" 
print(dir(test)) 

但是這並不擴展 - 該屬性僅適用於您的test實例。例如,方法不會被繼承。

class ClassA: 
    def __init__(self): 
     self.value = "1" 
     ClassB.__init__(self) 


class ClassB: 
    def __init__(self): 
     self.punk = "Punk" 
    def foo(self): 
     print("BAR!") 

test = ClassA() 
print(test.punk) # OK 
test.foo() # ERR! 
+0

也謝謝你!我完全錯過了。 – doom4

1

這部作品的原因是因爲你使用ClassB.__init__()修改ClassAself parmeter。

當你通過selfClassBClassA.__init__()內,ClassB.__init__()接受分配的屬性punk它傳遞的對象。 通常情況下,self應該是ClassB的一個實例,因爲Python會隱式傳遞值self。但是因爲你明確地傳遞了一個不同的參數 - 一個ClassA的實例 - Python使用該值代替。

這可以看作一個簡單的例子:

>>> class A: 
    def __init__(self): 
     B.__init__(self) 


>>> class B: 
    def __init__(self): 
     print('The type of self is: ', self) 


>>> a = A() 
The type of self is: <__main__.A object at 0x03E9A050> 
>>> 

如@chepner所提到的,其作爲如果使用常規方法和調用相同的是ClassA的的內部構造:

>>> class A: 
    def __init__(self): 
     B.method(self) 


>>> class B: 
    def method(self): 
     print('The type of self is: ', self) 


>>> a = A() 
The type of self is: <__main__.A object at 0x03E9A670> 
>>> 
+0

謝謝你。你們很快! – doom4

+0

很高興幫助@ doom4。 –