2015-07-09 100 views
-1

我有類的簡單的例子,在python:面向對象的Python

class song: 
    def __init__(self, x): 
     print x 

bang=song(['Our whole universe was in a hot dense state,Then nearly fourteen billion years ago expansion started, wait...']) 

這工作。 但在另一本書詞「對象」創建一個新的類時使用:

class song(object): 
    def __init__(self,x): 
     print x 

bang=song(['Our whole universe was in a hot dense state,Then nearly fourteen billion years ago expansion started, wait...']) 

這工作了。另外,如果目的是通過,被取代的,例如,X:

class song(x): 
    def __init__(self,x): 
     print x 

smile=song(['Our whole universe was in a hot dense state,Then nearly fourteen billion years ago expansion started, wait...']) 

它不工作(NameError: name x is not defined)。 什麼特別之處object,據我所知,它甚至不是一個保留字,是不是?爲什麼代碼與它一起工作,而與x - 不?

+4

你可能想看看[Python中繼承(https://docs.python.org/2/tutorial/classes.html#inheritance),然後在[老VS新式類(HTTPS: //wiki.python。org/moin/NewClassVsClassicClass) – dhke

+0

'NameError'通常是指嘗試引用不存在的內容。僅供將來參考。 – bcdan

回答

1

這不起作用,因爲x正在被視爲構造函數類。這意味着,基本上,爲了使您的代碼正常工作,x已被定義爲class

當您使用object創建一個類,您使用的模板類,是空的,使一個新類型的類。使用intdict也會發生類似的情況。新類繼承了該類型的屬性。

由於未定義類x,所以新類不能使用x作爲構造函數。因此,返回該錯誤。所有的

0

因爲object是你繼承的基礎對象。 x不存在作爲一個對象,因此不能從

繼承你可以這樣做:

class x(object): 
    def __init__(self, item) 
     self.item = item 


class song(x): 
    def print(self): 
     print(self.item) 


bang=song(['a bunch of text']) #why is this a list? 

bang.print() 

有你有它inheritance - 這麼多X的讓這個混亂

0

首先,你應該得到與inheritance

熟悉如圖所示在其他的答案就可以說明class song(x):,如果x是對自己的一類。通過這樣做,song類將繼承基類x中的方法。現在

,一類聲明從對象繼承的原因可以追溯到python2.2。這些類聲明稱爲:New style classes

他們有不同的對象模型,以經典的對象,並有一組不存在於經典對象的屬性和功能。這方面的一些例子是@property關鍵字,super()方法。有關它們的區別的更多細節可以在here找到,但它在Stack Overflow上也有廣泛的討論:here

建議使用這些new style classes以使您的基類繼承object類。