2017-02-13 75 views
1

我有其自變量和方法的Class1一個,和一種方法內我使用來自其它類(等級2)的另一種方法:Python3.x:從其他類不inheritation訪問self.xxx變量

import Class2 
class Class1: 
    def __init__(self): 
     self.1 = None 
     self.2 = None 
     ... 
    def method1(self): 
     do something 
    ... 
    def methodN(self): 
     Class2.method(self): 
    ... 

在Class2方法中,我使用Class1的相同自變量名稱(self.1,self.2等)。

我很驚訝的是,當Class2的方法到達結束時,我在Class2方法中使用的自變量仍然存在於Class1對象中。

如果我深知這只是不可能性時的Class2繼承Class1的,如:

import Class1 
class Class2(Class1): 
    Class1.__init__(self): 
    ... 

這怎麼可能?

感謝所有

編輯:schwobaseggl,非常感謝你的解釋。現在我已經理解了函數和方法之間的區別(在一些書中,這些詞被用作synonims)。所以在我的情況下,我不使用方法,而是使用函數,我也明白,如果我在Class2中使用self.xxx變量,而該變量不存在於Class1的對象(實例)中,則會爲該實例創建它。這是對的嗎? 所以self.1和self.2是Class1實例的變量,self.1和self.2是Class2函數的變量不一樣,但是Class2的函數覆蓋了Class1實例的自變量,是否正確? 但是如果我想要一個類函數使用自變量(我的意思是一個已經設置的值)的另一個類實例,我必須使用繼承,正確的?

回答

0

你的命名不太對。在Python 3中,沒有未綁定的方法。假設你有一個類B

class B(object): 
    def x(self): 
    self.b = 5 

然後B.x僅僅是一個函數只

> B.x 
<function B.x at 0x7f14dd0f1ae8> 

獲得訪問到一個實例時,它成爲一個方法:

> b = B() 
> b.x 
<bound method B.x of <__main__.B object at 0x7f14dd1102e8>> 

因此,當用一個隨機參數調用B.x,它不需要是B的一個實例,它只會對它做什麼定義功能 - 如果可能的話:

class A(object): 
    def x(self): 
    B.x(self) 

由於B.x套在它的參數self屬性b,當然我們希望的A任何情況下能有這樣的屬性b它傳遞給B.x後:

> a = A() 
> a.x() 
> a.b 
5 

您甚至不需要定義班級中的方法:

def x(arg): 
    arg.a = 7 

class A(object): 
    x = x 

> a = A() 
> A.x 
<function x at 0x7f14dd0f1378> 
> a.x 
<bound method x of <__main__.A object at 0x7f14db39aa90>> 
> a.x() 
> a.a 
7