国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python self,cls,decorator的理解

2020-02-23 04:45:20
字體:
來源:轉載
供稿:網友
1. self, cls 不是關鍵字
在python里面,self, cls 不是關鍵字,完全可以使用自己寫的任意變量代替實現一樣的效果
代碼1
代碼如下:
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
代碼如下:
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
代碼如下:
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
代碼如下:
class C:
@classmethod
def foo(cls, y):
print "classmethod", cls, y

這里有個疑惑的地方,不是很明白: 如果一個方法沒有使用@classmethod, 那么用Class.method()的方式,是會報錯的。但是@classmethod是個decorator, 那么它返回的也是一個函數,為什么這樣就可以直接被Class調用了呢?
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金湖县| 邳州市| 桃江县| 兴仁县| 灌南县| 阿城市| 江达县| 迁西县| 清涧县| 丹东市| 巴东县| 南木林县| 西华县| 延吉市| 四会市| 河池市| 桃江县| 凤山市| 南昌县| 库尔勒市| 伊川县| 宣威市| 泰州市| 阿城市| 逊克县| 嘉兴市| 昌乐县| 都兰县| 尉犁县| 南宫市| 东丽区| 潼南县| 囊谦县| 枣庄市| 汶上县| 遵化市| 西丰县| 沈丘县| 红安县| 澄江县| 张家界市|