1. 程式人生 > >《笨方法學 Python 3》42.物件、類及從屬關係

《笨方法學 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)

END!!!