2016年5月31日 星期二

Python_Note07

Class

類別 (class) 為物件 (object) 設計的模板, Python 裡所有東西都是物件,凡是物件都有屬性 (attribute) 方法 (method) 。所謂的屬性雷同變數 (variable) ,專屬於物件,方法類似函數 (function) ,同樣專屬於物件。

定義類別使用關鍵字 (keyword) class,形式如下


範例:

方法會預設一個識別字 (identifier) self 來代表物件本身自己,也可以自己取第一個參數的名稱,不過習慣上都用 self 。

內建函數 help() 會顯示物件(包括類別)的資訊, dir() 則會把物件(包括類別)的所有屬性與方法以串列 (list) 列出

建立物件


Special Methods

https://docs.python.org/3/reference/datamodel.html#special-method-names
類別中有一些以雙底線開始並且以雙底線結束的方法,稱之為類別的專有方法 (Special Method),專有方法是針對類別的特殊操作的一些方法,例如__init__方法。

init ()


  • 類別__init__(self):雷同建構子 (constructor),用來放置初始值。
  • 利用建構子 (constructor) 建立的物件被稱為實體(instance) ,實際上建立物件的整個過程是執行init () 方法 (method) 。自行定義的類別會有預先定義好的 init () ,我們也可以改寫 (override) 成我們自己需要的。
  • 改寫方式就是再定義一次,方法的定義與函數(function) 類似,兩者同樣使用關鍵字 (keyword) def。

範例:
class Demo:
    def __init__(self):
        self.name = 'Python'      #self.name 如同this.name
    def hello(self):
        print('hello',self.name)

d = Demo()
print(type(Demo))
print(type(d))
print('d.name : %s'%d.name)
d.hello()

Out:
<class 'type'>
<class '__main__.Demo'>
d.name : Python

hello Python

self

凡是實體的方法都需要一個特別的參數 -- self ,self 是個預設的保留字 (reserved word) ,所指的是實體本身自己,在 __init__() 所定義的實體屬性 (attribute) 都需要額外加上 self ,如第 3 行的 self.name,使用self.name 就可以使用到物件自己。self非關鍵字,所以可以改別的名稱。

self不是keyword的原因參考創作者Guido van Rossum的解釋
http://neopythonic.blogspot.tw/2008/10/why-explicit-self-has-to-stay.html


類別__init__()參數的設定
class Demo:
    def __init__(self.name):    #name : 參數
        self.name = name
    def hello(self):
        print('hello',self.name)

d = Demo('Tom')    #Tom : 引數
print(type(Demo))
print(type(d))
print('d.name : %s'%d.name)
d.hello()

Out:
<class 'type'>
<class '__main__.Demo'>
d.name : Tom
hello Tom

__doc__

類別 (class) 有 __doc__ 屬性 (attribute) ,這是三引號字串定義的文字,屬於類別的說明文件。

範例:

class Demo:
    '''
    Demo Document:
    hello python
    '''
    def __init__ (self,name):
        self.name = name
    def hello(self):
        print("hello",self.name)
d = Demo("Tom")
print(d.__doc__)

Out:

    Demo Document:
    hello python

Attribute

Python 類別 (class) 的屬性 (attribute) 有兩種,一種是類別屬性 (class attribute) ,另一種是實體屬性 (instance attribute)

範例:


通常類別屬性需要用類別名稱來存取,但若兩者的識別字 (identifier) 不同,實體物件 (object) 也可以存取類別屬性。且若是類別屬性與實體屬性的識別字相同,則實體物件只能存取實體屬性。

範例 (類別屬性與實體屬性的識別字不同):
class Demo:
    x = 0
     
    def __init__(self, i):
        self.i = i
        Demo.x += 1
     
    def __str__(self):
        return str(self.i)
          
    def hello(self):
        print("hello", self.i)

print("There are", Demo.x, "instances.")
a = Demo(1122)
a.hello()
print("a.x =", a.x)
b = Demo(3344)
b.hello()
print("b.x =", b.x)
c = Demo(5566)
c.hello()
print("c.x =", c.x)
d = Demo(7788)
d.hello()
print("d.x =", d.x)
e = Demo(9900)
e.hello()
print("e.x =", e.x)
print("After all, there are", Demo.x, "instances.")


Out:
There are 0 instances.
hello 1122
a.x = 1
hello 3344
b.x = 2
hello 5566
c.x = 3
hello 7788
d.x = 4
hello 9900
e.x = 5

After all, there are 5 instances.

範例 (類別屬性與實體屬性的識別字相同):

class Demo:
    i = 0

    def __init__(self, i):
        self.i = i
        Demo.i += 1

    def __str__(self):
        return str(self.i)

    def hello(self):
        print("hello", self.i)

print("There are", Demo.i, "instances.")
a = Demo(1122)
a.hello()
print("a.i =", a.i)
b = Demo(3344)
b.hello()
print("b.i =", b.i)
c = Demo(5566)
c.hello()
print("c.i =", c.i)
d = Demo(7788)
d.hello()
print("d.i =", d.i)
e = Demo(9900)
e.hello()
print("e.i =", e.i)

print("After all, there are", Demo.i, "instances.")

Out:
There are 0 instances.
hello 1122
a.i = 1122
hello 3344
b.i = 3344
hello 5566
c.i = 5566
hello 7788
d.i = 7788
hello 9900
e.i = 9900
After all, there are 5 instances.

沒有留言:

張貼留言