Python中一切都是對象。類提供了創建新類型對象的機制。這篇教程中,我們不談類和面向對象的基本知識,而專注在更好地理解Python面向對象編程上。假設我們使用新風格的python類,它們繼承自object父類。
定義類
class 語句可以定義一系列的屬性、變量、方法,他們被該類的實例對象所共享。下面給出一個簡單類定義:
class Account(object): num_accounts = 0 def __init__(self, name, balance): self.name = name self.balance = balance Account.num_accounts += 1 def del_account(self): Account.num_accounts -= 1 def deposit(self, amt): self.balance = self.balance + amt def withdraw(self, amt): self.balance = self.balance - amt def inquiry(self): return self.balance
類定義引入了以下新對象:
類對象
實例對象
方法對象
類對象
程序執行過程中遇到類定義時,就會創建新的命名空間,命名空間包含所有類變量和方法定義的名稱綁定。注意該命名空間并沒有創建類方法可以使用的新局部作用域,因此在方法中訪問變量需要全限定名稱。上一節的Account類演示了該特性;嘗試訪問num_of_accounts變量的方法需要使用全限定名稱Account.num_of_accounts,否則,如果沒有在__init__方法中使用全限定名稱,會引發如下錯誤:
class Account(object): num_accounts = 0 def __init__(self, name, balance): self.name = name self.balance = balance num_accounts += 1 def del_account(self): Account.num_accounts -= 1 def deposit(self, amt): self.balance = self.balance + amt def withdraw(self, amt): self.balance = self.balance - amt def inquiry(self): return self.balance >>> acct = Account('obi', 10)Traceback (most recent call last): File "python", line 1, in <module> File "python", line 9, in __init__UnboundLocalError: local variable 'num_accounts' referenced before assignment類定義執行的最后,會創建一個類對象。在進入類定義之前有效的那個作用域現在被恢復了,同時類對象被綁定到類定義頭的類名上。
先偏離下話題,你可能會問如果創建的類是對象,那么類對象的類是什么呢?。與一切都是對象的python哲學一致,類對象確實有個類,即python新風格類中的type類。
>>> type(Account)<class 'type'>
讓你更迷惑一點,Account類型的類型是type。type類是個元類,用于創建其他類,我們稍后教程中再介紹。
類對象支持屬性引用和實例化。屬性通過標準的點語法引用,即對象后跟句點,然后是屬性名:obj.name。有效的屬性名是類對象創建后類命名空間中出現的所有變量和方法名。例如:
新聞熱點
疑難解答