2010-01-04 58 views
3

我在Python中使用重載或屏蔽類來玩弄遊戲。下面的代碼示例創建等價類嗎?在Python中創建等效的類?

class CustASample(object): 
    def __init__(self): 
     self.__class__.__name__ = "Sample" 

    def doSomething(self): 
     dummy = 1 

class Sample(object): 
    def doSomething(self): 
     dummy = 1 

編輯:從高盛的意見,並和很好的答案,它發生在我,我真的很想問:什麼「屬性」使這些類的區別?

因爲

>>> dir(a) == dir(b) 
True 

>>> print Sample 
<class '__main__.Sample'> 
>>> print CustASample 
<class '__main__.Sample'> 

>>> Sample == CustASample 
False 
+0

您可能想要使用從對象繼承的新式類。 – 2010-01-04 14:33:55

+1

「等值」對您意味着什麼?你有一些測試用例嗎? – 2010-01-04 15:35:48

回答

10

沒有,他們還是不同的。

a = CustASample() 
b = Sample() 
a.__class__ is b.__class__ 
-> False 

這裏是你如何能做到這一點:

class A(object): 
    def __init__(self): 
     self.__class__ = B 

class B(object): 
    def bark(self): 
     print "Wuff!" 

a = A() 
b = B() 
a.__class__ is b.__class__ 
-> True 

a.bark() 
-> Wuff! 

b.bark() 
-> Wuff! 

通常你會做的__new__方法,而不是在__init__

class C(object): 
    def __new__(cls): 
     return A() 

要回答你的更新問題:

>>> a = object() 
>>> b = object() 
>>> a == b 
False 

爲什麼a不等於b,因爲兩者都只是沒有屬性的普通對象?

那麼,這個答案很簡單。 ==運算符調用__eq__(如果可用)。但除非你自己定義它不是。而不是它a is b得到使用。

is比較對象的ID。 (在CPython中,內存地址)。你可以得到這樣一個對象的ID:

>>> id(a) 
156808 
0

類,不僅是實例,也是對象。例如,你可以得到id(Sample)。嘗試一下,看看這兩個數字是不同的,因爲不同類別的記憶位置不同。它們不是同一個對象。這就像問是否[] is []

編輯:太晚了,由gs解釋更好。