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__()參數的設定
範例:
範例:
通常類別屬性需要用類別名稱來存取,但若兩者的識別字 (identifier) 不同,實體物件 (object) 也可以存取類別屬性。且若是類別屬性與實體屬性的識別字相同,則實體物件只能存取實體屬性。
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) 也可以存取類別屬性。且若是類別屬性與實體屬性的識別字相同,則實體物件只能存取實體屬性。
範例 (類別屬性與實體屬性的識別字不同):
Out:
範例 (類別屬性與實體屬性的識別字相同):
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.
沒有留言:
張貼留言