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