Python Object-oriented Programming -2 Attribute and Class
What Is Object? Class? Attribute?
Everything in Python is object.
mylist = [1, 2, 3]
myset = set()type(mylist) #list
type(myset) #set
如上常見的Python原生形態,其實本身也是物件的一種。關於物件我嘗試解釋:Class定義了Object,而Object就是Class的一個Instance。以下程式碼用以舉例上述概念:
Class in Python
class Dog(): passmy_dog = Dog()type(my_dog) #__main__.Dog
上面程式碼定義了一個類別Dog,關鍵字使用class
,由於用於舉例因此加上pass
關鍵字讓他快速跳過 。my_dog = Dog()
此段落是初始化Dog物件產生一個instance
my_dog,此例子初始化由於pass
關係,將什麼也不做地產生instance
,我們可以透過type()
觀察可以得知my_dog型別為 Dog
的物件。
在Python中,class
關鍵字命名慣例上沿襲PEP8 Code Style慣例:
Class names should normally use the CapWords convention.
簡單說就是首字大寫。以上簡單的示範如何定義類別與產生物件,接下來將探討如何在類別中定義屬性(attribute)/行為(behavior)
Attribute in Python
關於attribute,可以很直觀的想像一個類別/物件擁有的屬性,或是相依於類別/物件的資訊。延續狗的例子,狗類別應該會有什麼資訊跟著?以下嘗試描述一個狗類別Dog可能的屬性:
class Dog():
# class object attribute
# same for any instance of a class
species = 'mammal'
def __init__(self, breed, name, spots):
self.breed = breed
self.name = name
# expected as boolean
self.spots = spots
程式中利用__init__
這個特定的名稱的方法,定義類別(class)的實例(instance)建立之後,要進行的初始化動作。因此,我們可以把定義的屬性在__init__宣告並且賦值。上述程式碼也定義類別Dog應該要有breed, name, spots這三種屬性,分別定義這隻狗的品種、名字、以及是否有斑點。
此外較特別的是,根據需求,還可以定義類似global attribute的方式,讓所有的Dog擁有一個如常數般的屬性。以上例子就定義了species = ‘mammal’,意即所有狗應該都是哺乳類,也就是在產生物件時,直接擁有species屬性並且值為mammal。
self
關鍵字代表該 instance自身,類似於Java中的this
,因此self.breed
就是instance
本身的屬性(attribute),而紅框breed參數則是初始化instance
時所賦的值。定義好屬性後,我們可以嘗試初始化Dog物件:
my_dog = Dog(breed=’Huskie’, name=’GG’, spots=True)my_dog.species # mammal
my_dog.breed # Huskie
my_dog.name # GG
...
上面程式碼將my_dog初始化後賦予對應值,Dog的物件因此生成,並擁有自己的屬性。與其他程式語言類似,利用,<instance_name>.<attribute_name>
,可以取用自己instance
的屬性值 。
基礎的物件就這樣搞定了!擁有屬性、可被賦值。不過,似乎不能做什麼事情,因此我們要開始定義物件的行為,使物件能夠被使用或者是與其本身的屬性互動。
Actions/Behavior in Python
其實也可以稱為method
,通常是一個類別中對於屬性值的增刪改查動作,或是改變物件值的狀態。延續Dog例子,所有的Dog應該都會吠叫,因此我們可以替Dog物件利用method
定義行為:
class Dog():
# class object attribute
# same for any instance of a class
species = 'mammal'
def __init__(self, breed, name, spots):
self.breed = breed
self.name = name
# expected as boolean
self.spots = spots
# operation/actions --> method
def bark(self, number):
print('WOOF! My name is {} and the number is {}'.format(self.name, number))
一樣用self關鍵字作為此method
的第一個參數,代表instance
自身的行為。此外給一個參數number並且印出,因此我們可以重新初始化並且讓Dog instance
動起來:
my_dog.bark(10)
# WOOF! My name is GG and the number is 10
那跟function
有什麼不同? 一般而言,在class中的function,會被稱做method
(真的很多名詞,覺得痛苦)
以上大致介紹了Python中class以及attribute的用法,作為未來繼續探究OOP的基礎。先建立物件後,物件間的互動以及關係將會後續文章繼續探索。