《笨方法學 Python 3》42.物件、類及從屬關係
有個重要的概念必須弄明白,那就是‘類’和‘物件’的區別。
原文中花費了大量語段來描述,我就按個人理解簡單的歸納一下,可能不對,如有誤,請指出:
1.類:就是具有相同屬性的方法的集合,此處的方法就是指的函式,一個類裡面包含大量的函式(方法),這些函式之間具有共同之處。
2.物件:物件就是類的例項化,類就是本體。本體是無法直接呼叫的,而物件就是類的副本,分身之類的東西,通過將類例項化得到物件,然後像變數一樣賦值給一個東西,就可以通過這個東西呼叫這個類裡面的方法。
3.從屬關係:is-a(是什麼)和has-a(有什麼):
按照書中的例子,‘魚’ 是一個類,‘泥鰍’ 也是一個類,‘泥鰍’ is-a ‘魚’,則 ‘魚’ 是 ‘泥鰍’ 的父類。‘泥鰍’ has-a ‘鬍鬚’,則 ‘鬍鬚’ 是 ‘泥鰍’ 的屬性或者方法。
如果給這隻 ‘泥鰍’ 取個名字,叫 ‘小李’,那麼取名這個行為就叫做 ‘例項化’ ,如果你使用了 ‘小李’ (比如用它做了個菜),這樣它是一個物件。
基礎練習:
下面的程式碼不需要手碼,甚至不需要執行,只要把註釋下面的程式碼的關係寫到註釋後面就行了,主要是練習從屬關係的:
## Animal is-a object (yes, sort of confusing) look at the extra credit class Animal(object): pass ##Dog is-a Animal class Dog(Animal): def __init__(self, name): ##?? self.name = name ##?? class Cat(Animal): def __init__(self, name): ##?? self.name = name ##?? class Person(object): def __init__(self, name): ##?? self.name = name ## Person has-a pet of some kind self.pet = None ##?? class Employee(Person): def __init__(self, name, salary):TypeError: prin() takes 1 positional argument but 2 were given class Fish(object): pass ##?? class Salmon(Fish): pass ##?? class Halibut(Fish): pass ## rover is-a Dog rover = Dog("Rover") ##?? satan = Cat("Satan") ##?? mary = Person("Mary") ##?? mary.pet = satan ##?? frank = Employee("Frank", 120000) ##?? frank.pet = rover ##?? flipper = Fish() ##?? crouse = Salmon() ##?? harry = Halibut() # ================================
關於class Name(object)
在Python 3 中,你不需要在類名後面加(object),但是Python是一門優雅的語言,它信奉“顯式優於隱式”,所以最好還是寫上,至於(object)具體有什麼含義,只要記住 class Name(objcet) 是一個“基本的簡單類”就行了。
另,程式碼中有一行:super(Employes, self).__init__(name),是做什麼用的?
這個是Python中呼叫父類的__init__方法的一個方法。詳細瞭解可以百度 super Python 來了解一下。值得注意的是Python 3 中這個方法可以簡化為 super().__init__(name)