1:類和對象
是面向對象中的倆個重要概念,類是對事物的抽象,比如人類,球類。對象是事物的執行個體,比如足球,籃球。球類可以對球的特征和行為進行抽象,然後可以執行個體化一個真實的球體出來。
2:類的定義
類把需要的變量和函數組合成一起,這種包含稱為“封裝”。。classA(object):
3:類的結構
class類名:
成員變量-屬性 ## 類的屬性是對資料的封裝
成員函數-方法 ## 類的方法是對類的行為進行封裝
類的建立:
class MyClass1(object): ## 類名
color = 'Black' ## 類的屬性-變量
def fun(self): ## 類的方法中必須有參數self,這是成員函數類的方法
print "I am function"
#!/usr/bin/python
class People():
color = 'yellow' ## 成員變量
def think(self): ## 成員函數
self.color = 'Black' ## self表示類本身
print 'I am a %s' % self.color
print 'I am a thinker'
ren = People() ## 把類賦予一個變量,即執行個體化
print ren.color
ren.think()
複制
4:類的屬性
公有屬性:在類中類外都可以使用。
私有屬性:隻能在類中使用,定義方式為__name(雙下劃線)
内置屬性:由系統定義類的時候預設添加的,由前後雙下劃線構成。__dict__,__module__。
#!/usr/bin/python
class People():
color = 'yellow'
__age = 20
def think(self):
self.color = 'Black'
print 'I am a %s' % self.color
print 'I am a thinker'
print self.__age ## 私有函數,隻能在類中使用
ren = People()
print ren.color
ren.think()
print ren._People__age ## 僅測試使用,類外使用私有函數
複制
5:類的方法相當于函數,類的屬性相當于變量。
方法的定義跟函數一樣,但是需要self作為第一個參數。
公有方法:跟公有屬性一樣,類内類外都可以使用
私有方法:跟私有屬性一樣,隻能類内使用。__self
self:用來區分類跟方法,self本身表示類
類方法:被classmethod編譯過的函數,能被類所調用,也能被對象調用(繼承的關系)
靜态方法:被staticmethod編譯過的函數,可以被類直接調用,靜态方法不需要設定self參數。
裝飾器:
@classmethod:類方法
@staticmethod:靜态方法
6:對象的建立
建立對象的過程稱之為執行個體化:當一個對象被建立後,包含三個方面的特性:對象句柄,屬性,方法。句柄用來區分對象。
對象的屬性和方法與類中的成員變量和成員函數相對應
object=MyClass() ## 建立類的一個執行個體(對象),通過對象來調用方法和屬性
#!/usr/bin/python
# coding:utf-8
class MyClass1(object): ## 類
color = 'Yellow' ## 類的屬性--變量
__age = 20 ## 類的私有屬性,隻能在類中使用
@classmethod
def __hide(self): ## 類的隐藏方法,隻能在類中使用
print "I am hidemethods!"
@classmethod ## 裝飾,對象和類都可以調用
def fun(self): ## 類的方法--函數
print self.__age ## self等同類,表示調用類的私有屬性
print 'This is function!'
@staticmethod ## 裝飾,對象和類都能調用,不需要self
def fun1(): ## 不需要self
print MyClass1.color ## 直接使用類調用類的屬性或方法
MyClass1.__hide() ## 調用類的隐藏方法
class InsideClass(object): ## 類中類,内部類
Inside = 'Red' ## 内部類的屬性
@classmethod
def InsideFun(self): ## 内部類的方法
print self.Inside
object = MyClass1() ## 對象,執行個體化類
object.fun() ## 對象調用類的方法
MyClass1.fun() ## 類調用類的方法
MyClass1.fun1()
object_inside = object.InsideClass() ## 先調用外部類,再調用内部類
MyClass1.InsideClass.InsideFun() ## 調用内部類的方法
print object_inside.Inside ## 調用内部類的屬性
複制
7:内部方法(魔術方法)
def __str__(self): ## 如果直接執行個體化類,會傳回__str__的值,而不是提示這樣<對象>
return "This is class object!"
構造函數
def __init__(self,c='Black'): ## 初始化對象的屬性,但不會改變類的屬性
self.color = c
析構函數
def __del__(self): ## 主要用于釋放資源,一般執行與腳本的最後
#!/usr/bin/python
class PeoPle(object):
color = 'Black'
def __init__(self,c): ## 初始化屬性,c需要在執行個體化類的時候,跟在後面
self.color = c
print "Init runinng ......" ## 隻要把類執行個體化成對象,就會列印這行,
def fun1(self):
print "Color is: %s" % self.color
pe = PeoPle('Red')
print "Object print is: %s" %pe.color ## __init__會影響對象的屬性
print "Class print is: %s" %PeoPle.color ## 類不會受__init__的影響
複制
類的繼承:
單類繼承
#!/usr/bin/python
class PeoPle(object):
color = 'Black'
def __init__(self,c): ## 初始化參數
self.color = c
print "Init runinng ......"
@classmethod ## 裝飾方法,使其對象和類都可以調用
def fun1(self):
print "Color is: %s" % self.color
class MyClass(PeoPle): ## 繼承父類PeoPle
color = 'MyClass'
def __init__(self):
PeoPle.__init__(self.'Red') ## 表示繼承父類的__init__構造函數。
@classmethod
def fun1(self):
print "This is MyClass the function"
pass
my=MyClass() ## 由于MyClass類中繼承過PeoPle裡的__init__參數。
print MyClass.color ## 優先傳回MyClass裡的屬性
my.fun1() ## 優先傳回MyClass裡的方法
PeoPle.fun1() ## 傳回PeoPle裡的fun1方法
MyClass.fun1() ## 傳回MyClass裡的fun1方法
pe = PeoPle('Green') ## 由于PeoPle初始化__init__那裡需要倆個參數,是以這裡要加一個參數
print "Object print is: %s" % pe.color ## 列印初始化後對象的屬性即Green
print "Class print is: %s" % PeoPle.color ## 列印類屬性即Black
複制
多類繼承:
#!/usr/bin/python
class PeoPle(object):
def __init__(self):
self.dwell = 'Earth'
self.color = 'Yellow'
def think(self):
print "I dwell am %s!" % self.dwell
class Chinese(object):
color = 'Black'
def __init__(self):
self.dwell = 'China'
def think(self):
print "I am chinese %s " % self.color
class MyClass(Chinese,PeoPle): ## 預設首先繼續第一個類的屬性跟方法
def __init__(self):
PeoPle.__init__(self) ## 表示使用指定類的屬性
pass
my = MyClass()
my.think() ## 傳回I am Chinese Yellow
複制
類的屬性---總結
- 類屬性(公有屬性): 可以在類中使用,相當于變量。
- 類私有屬性(私有屬性): 隻能函數中使用,無法被對象調用
- 對象的公有屬性: 對象可以調用
- 對象的私有屬性: 隻能類中調用
- 内置屬性:
- 函數的局部變量: 隻能在本函數中使用
- 函數的全局變量: 可以在類中所有的函數裡使用
#!/usr/bin/python
# coding:utf8
val6 = "全局變量"
print '*' * 50
class My(object):
val1 = "類的公有屬性 val1"
__val2 = "類的私有屬性 __val2"
def fun(self):
self.val3 = "對象的公有屬性 val3"
self.__val4 = "對象的私有屬性 __val4"
val5 = "函數的局部變量,隻能在本函數使用"
global val6
val6 = "函數的全局變量,可以在類中所有的函數中使用"
def fun1(self):
print val6
my = My()
print my.val1
print my._My__val2
my.fun()
print '*' * 50
my.fun1()
複制
類的方法總結:
- 公有方法:
- 私有方法:
- 類方法:
- 靜态方法:
- 内置方法:
#!/usr/bin/python
#-*- coding:utf8 -*_
class MyClass(object):
name = 'Warning'
def __init__(self):
self.fun1()
self.__fun2()
self.fun3()
self.fun4()
def fun1(self):
print "%s %s" % (self.name,'我是公有方法')
def __fun2(self):
print "%s %s" % (self.name,'我是私有方法')
@classmethod
def fun3(self):
print "%s %s" % (self.name,'我是類方法')
@staticmethod
def fun4():
print "%s %s" % (MyClass.name,'我是靜态方法')
my = MyClass()
my.fun1() ## 調用公有方法
MyClass.fun3() ## 調用類方法
MyClass.fun4() ## 調用靜态方法,注意靜态方法不需要self,與類方法的差別
複制