Python學習 第六章 類與物件

2021-10-02 15:17:29 字數 4419 閱讀 5559

6.1.4 例項方法和自動繫結

6.2 方法

6.3 成員變數

python定義類的簡單語法如下:

class 類名:

執行語句...

零個到多個類變數...

零個到多個方法.

..

class

person

: hair=

'black'

def__init__

(self,name=

'charlie'

,age=8)

: self.name=name

self.age=age

defsayhi

(self,content)

:print

(content)

p=person(

)print

(p.name,p.age)

p.name=

'liuan'

p.sayhi(

'hello,world!'

)print

(p.name,p.age)

程式可以動態為p物件增加例項變數,只要為它的新變數賦值即可,也可以動態刪除例項變數(del)。

# 增加例項變數

p.skill=

["fishing"

,"dancing"

]print

(p.skill)

# ['fishing', 'dancing']

# 刪除例項變數

del p.name

print

(p.name)

# attributeerror: 'person' object has no attribute 'name'

動態新增的函式不會將呼叫者繫結到第乙個引數(一般叫self),需要手動繫結

def

eatsomething

(self,content)

:print

("eat "

+content)

p.eatsomething=eatsomething

# 手動繫結呼叫者到第乙個引數

p.eatsomething(p,

"banana"

)print

(p.eatsomething)

# eat banana

或者可以引入methodtype繫結

def

singsong

(self,content)

:print

("sing "

+content)

from types import methodtype

p.singsong=methodtype(singsong,p)

p.singsong=

"愛你一萬年"

print

(p.singsong)

class

dog:

defjump

(self)

:print

("正在執行jump方法"

)def

run(self)

: self.jump(

)print

("正在執行run方法"

)dog=dog(

)dog.run(

)

上面**中的run()方法中的self代表該方法的呼叫者,self不能省略.

當self引數作為物件的預設引用時,程式可以像訪問普通變數一樣來訪問這個self引數,可以將self引數當作例項方法的返回值

class

returnself

:def

grow

(self):if

hasattr

(self,

'age'):

self.age+=

1else

: self.age=

1return self

rs=returnself(

)rs.grow(

).grow(

).grow(

)print

(rs.age)

以下通過類直接呼叫例項方法,錯誤**:

class

dog:

defjump

(self)

:print

("正在執行jump方法"

)def

run(self)

: self.jump(

)print

("正在執行run方法"

)dog.run(

)

typeerror: run() missing 1 required positional argument: 'self'

呼叫run方法缺少self引數的傳入,所以報錯.

說明使用類呼叫例項方法,python不會自動繫結self引數.必須手動為方法的第乙個引數傳入引數值

class

dog:

defjump

(self)

:print

("正在執行jump方法"

)def

run(self)

: self.jump(

)print

("正在執行run方法"

)dog=dog(

)# 顯示地為方法的第乙個引數繫結引數值

dog.run(dog)

這種呼叫方式成為「未繫結方法」

使用@classmethod修飾類方法,python自動繫結方法第一引數

使用@staticmethod修飾靜態方法,python不會自動繫結第一引數,手動指定

class

bird

: @classmethod

deffly

(cls)

:print

("類方法fly:"

+str

(cls)

) @staticmethod

definfo

(p):

print

("靜態方法info:"

+p)bird.fly(

)bird.info(

"vvvvvvv"

)

使用了@staticmethod定義的靜態方法,既可以使用類呼叫又可以使用物件呼叫,不管哪種呼叫方式,都不會為靜態方法自動繫結第一引數.

使用@符號引用已有的函式後,可用於修飾其他函式,可開發自定義的函式裝飾器.

過程為以下兩個步驟:

def

funa

(fn)

:print

("a"

) fn(

)return

"acdf"

@funa

deffunb()

:print

("b"

)print

(funb)

result:

a

bacdf

如果修飾函式返回的是函式,則b被替換後還是函式:

def

foo(fn)

:def

bar(

*args)

:print

("===1==="

,args)

n=args[0]

print

("===2==="

,n *

(n-1))

print

(fn.__name__)

fn(n*

(n-1))

print

("*"*15

)return fn(n *

(n-1))

return bar

@foo

defmytest

(a):

print

("==mytest函式=="

,a)mytest(6,

5)

這裡,b被替換為bar函式

result:

===1=== (6, 5)

===2=== 30

mytest

==mytest函式== 30

***************

==mytest函式== 30

實際用處:

java第六章類與物件

類修飾符的含義 public 將乙個類宣告為公共類,它可以被任何物件訪問,乙個程式的主類必須為公共類 abstract 將乙個類宣告為抽象類,沒有實現的方法,需要子類提供方法的實現.final 將乙個類宣告為最終類即非繼承類,表示它不能被其他類所繼承 friendly 友元型別,預設的修飾符,只有在...

第六章 類與物件 類的包含

1.組合描述的是類與類之間的整體與部分的關係,即如果在邏輯上a是b的一部分,則允許a和其他資料成員組合成b。例如 發動機 車輪 電池 車門 方向盤 底盤都是小汽車的一部分,它們組合成汽車,而不能說發動機是汽車的一種。2.類的組合,指的是類中內嵌其它類的物件作為成員資料 實現組合用類成員表示,即乙個類...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...