新式類:
class
mynewobjecttype
(bases):
'define mynewobjecttype class'
class_suite
經典類:沒有指定乙個父類,或者子類化的基本類沒有父類,就建立了乙個經典類
class
mynewobjecttype:
'define mynewobjecttype classic class'
class_suite
建立乙個例項,只使用類作為命名空間容器
class mydata(object):
pass
mathobj = mydata()
mathobj.x = 4
mathobj.y = 5
print mathobj.x + mathobj.y
print mathobj.x * mathobj.y
mathobj.x和mathobj.y是例項屬性,因為它們不是類mydata的屬性,而是例項物件(mathobj)的獨有屬性。
class
mydatawithmethod
(object):
#定義類
defprintfoo
(self):
#定義方法,不需要自己傳入self,因為它是自動傳入的
print
'you invoked printfoo()!'
myobj = mydatawithmethod() #建立例項
myobj.printfoo() #呼叫方法
# 建立乙個類(類定義)
class
addrbookentry
(object):
'address book entry class'
def__init__
(self,nm,ph):
self.name = nm
self.phone = ph
print
'created instance for: ', self.name
defupdatephone
(self, newph):
self.phone = newph
print
'updated phone# for:', self.name
# 建立例項(例項化) 會自動呼叫__init__()
john = addrbookentry('john doe', '408-555-1212')
jane = addrbookentry('jane doe', '650-55-1212')
# 方法呼叫(通過例項)
john.updatephone('415-555-1212') #更新john doe的**
print john.phone
# 建立子類
class
empladdrbookentry
(addrbookentry):
'employee address book entry class'
#員工位址薄類
def__init__
(self, nm, ph, id, em):
addrbookentry.__init__(self, nm, ph)
self.empid = id
self.email = em
defupdateemail
(self, newem):
self.email = newem
print
'updated e-mail address for:', self.name
# 使用子類
john = empladdrbookentry('john doe', '408-555-1212',42, '[email protected]')
每個子類最好定義它自己的構造器,不然,基類的構造器會被呼叫。如果子類重寫基類的構造器,基類的構造器就不會自動呼叫了–這樣,基類的構造器就必須顯式寫出才會被執行。
檢視類的屬性:dir()或者通過訪問類的字典屬性__dict__
特殊的類屬性
特殊類屬性
–c.__name__
類c的名字(字串)
c.__doc__
類c的文件字串
c.__bases__
類c的所有父類構成的元組
c.__dict__
類c的屬性
c.__module__
類c定義所在的模組
c.__class__
例項c對應的類(僅新式類中)
乙個子類可以繼承它的基類的任何屬性,不管是資料屬性還是方法。
class
p(object):
pass
class
c(p):
pass
c=c() #例項化子類
c.__class__ #
c.__bases__ #
1.通過繼承覆蓋方法class
p(object):
deffoo
(self):
print
'hi, i am p-foo()'
class
c(p):
deffoo
(self):
print
'hi, i am c-foo()'
#在子類中呼叫基類方法
class
c(p):
deffoo
(self):
super(c, self).foo()
print
'hi, i am c-foo()'
2.多重繼承# 經典類簡單屬性查詢示例(深度優先)
class
p1:def
foo(self):
print
'called p1-foo()'
calss p2:
deffoo(self):
print
'called p2-foo()'
defbar
(self):
print
'called p2-bar()'
class
c1(p1, p2):
# 子類1, 從p1,p2派生
pass
calss c2(p1, p2):
defbar(self):
print
'called c2-bar()'
class
gc(c1, c2):
#定義子孫類,從c1 c2派生
pass
gc = gc()
gc.foo() #p1-foo() gc => c1 => p1
gc.bar() #p2-bar() gc => c1 => p1 => p2
c2.bar(gc) #呼叫c2的bar()方法
# 新式類 廣度優先搜尋
class
p1(object):
deffoo
(self):
print
'called p1-foo()'
calss p2(object):
deffoo(self):
print
'called p2-foo()'
defbar
(self):
print
'called p2-bar()'
class
c1(p1, p2):
# 子類1, 從p1,p2派生
pass
calss c2(p1, p2):
defbar(self):
print
'called c2-bar()'
class
gc(c1, c2):
#定義子孫類,從c1 c2派生
pass
gc = gc()
gc.foo() # p1-foo() gc => c1 => c2 =>p1
gc.bar() # c2-bar() gc => c1 => c2
p2.bar(gc) #呼叫p2的方法
class
myclass
(object):
def__init__
(self):
self.foo = 100
my_inst = myclass()
hasattr(my_inst,'foo') #true
getattr(my_inst,'foo') #100
hasattr(my_inst,'bar') #false
getattr(c,'bar','oops') # 'oops'
setattr(my_inst, 'bar', 'my attr')
dir(my_inst) #['__doc__','__module','bar', 'foo']
getattr(my_inst, 'bar') #等同於my_inst.bar 'my attr'
delattr(my_inst, 'foo')
dir(my_inst) #['__doc__', '__module__', 'bar']
不懂,主要用途是用來查詢父類的屬性 Python物件導向程式設計
class mynewobjecttype bases define mynewobjecttype class class suite例項化 myfirstobject mynewobjecttype class mydatawithmethod object defprintfoo self p...
python物件導向程式設計
程式設計正規化 程式設計時程式設計師用特定的語法 資料結構 演算法組成的 在計算機上執行任務的過程。實現乙個任務有不同的方式,對這些不同的程式設計方式的特點進行歸納總結得出的程式設計方式類別,即為程式設計正規化。不同的程式設計正規化本質上代表對各種型別的任務採取的不同的解決問題的思路,兩種最重要的程...
python 物件導向程式設計
宣告 class colleague object pass 建立物件 lisi colleague class colleague object def init self,name,age,self 永遠是第乙個引數,也是必須的 self 表示例項本身,呼叫時不需要傳入 var 表示 var是該...