對於python中的self,cls,decorator的理解

來源:互聯網
上載者:User
1. self, cls 不是關鍵字

在python裡面,self, cls 不是關鍵字,完全可以使用自己寫的任意變數代替實現一樣的效果

代碼1

Python代碼
Code:

class MyTest:
myname = 'peter'
def sayhello(hello):
print "say hello to %s" % hello.myname

if __name__ == "__main__":
MyTest().sayhello()

class MyTest: myname = 'peter' def sayhello(hello): print "say hello to %s" % hello.myname if __name__ == "__main__": MyTest().sayhello()

代碼1中, 用hello代替掉了self, 得到的是一樣的效果,也可以替換成java中常用的this.

結論 : self和cls只是python中約定的寫法,本質上只是一個函數參數而已,沒有特別含義。

任何對象調用方法都會把把自己作為該方法中的第一個參數,傳遞到函數中。(因為在python中萬物都是對象,所以當我們使用Class.method()的時候,實際上的第一個參數是我們約定的cls)

2. 類的定義可以動態修改

代碼2

Code:

class MyTest:
myname = 'peter'
def sayhello(self):
print "say hello to %s" % self.myname

if __name__ == "__main__":
MyTest.myname = 'hone'
MyTest.sayhello = lambda self,name: "I want say hello to %s" % name
MyTest.saygoodbye = lambda self,name: "I do not want say goodbye to %s" % name
print MyTest().sayhello(MyTest.myname)
print MyTest().saygoodbye(MyTest.myname)

class MyTest: myname = 'peter' def sayhello(self): print "say hello to %s" % self.myname if __name__ == "__main__": MyTest.myname = 'hone' MyTest.sayhello = lambda self,name: "I want say hello to %s" % name MyTest.saygoodbye = lambda self,name: "I do not want say goodbye to %s" % name print MyTest().sayhello(MyTest.myname) print MyTest().saygoodbye(MyTest.myname)

這裡修改了MyTest類中的變數和函數定義, 執行個體化的instance有了不同的行為特徵。

3. decorator

decorator是一個函數, 接收一個函數作為參數, 傳回值是一個函數

代碼3

Python代碼
Code:

def enhanced(meth):
def new(self, y):
print "I am enhanced"
return meth(self, y)
return new
class C:
def bar(self, x):
print "some method says:", x
bar = enhanced(bar)

def enhanced(meth): def new(self, y): print "I am enhanced" return meth(self, y) return new class C: def bar(self, x): print "some method says:", x bar = enhanced(bar)

上面是一個比較典型的應用

以常用的@classmethod為例

正常的使用方法是

代碼4

Python代碼
Code:

class C:
@classmethod
def foo(cls, y):
print "classmethod", cls, y

class C: @classmethod def foo(cls, y): print "classmethod", cls, y

這裡有個疑惑的地方,不是很明白: 如果一個方法沒有使用@classmethod, 那麼用Class.method()的方式,是會報錯的。但是@classmethod是個decorator, 那麼它返回的也是一個函數,為什麼這樣就可以直接被Class調用了呢?

from:http://www.cnblogs.com/eplussoft/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.