python 物件導向程式設計

2021-07-05 18:35:17 字數 4822 閱讀 1816

新式類:

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是該...