1、實例方法html
實例方法就是類的實例可以使用的方法。以下:python
複製代碼代碼以下:編程
class Foo: def __init__(self, name): self.name = name def hi(self): print self.name if __name__ == '__main__': foo01 = Foo('letian') foo01.hi() print type(Foo) print type(foo01) print id(foo01) print id(Foo)
運行結果爲:編程語言
letian <type 'classobj'> <type 'instance'> 40124704 31323448[code]
能夠看到,Foo的type爲classobj(類對象,python中定義的類自己也是對象),foo01的type爲instance(實例)。而hi()是實例方法,因此foo01.hi()會輸出'letian'。實例方法的第一個參數默認爲self,代指實例。self不是一個關鍵字,而是約定的寫法。init()是生成實例時默認調用的實例方法。將Foo的定義改成如下形式:
ide
class Foo: def __init__(this, name): this.name = name def hi(here): print here.name
運行依然正確。 內置函數id用來查看對象的標識符,下面是其doc內容:函數
複製代碼代碼以下:this
>>> print id.__doc__ id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
2、靜態方法code
靜態方法是一種普通函數,就位於類定義的命名空間中,它不會對任何實例類型進行操做。使用裝飾器@staticmethod定義靜態方法。類對象和實例均可以調用靜態方法:htm
複製代碼代碼以下:對象
class Foo: def __init__(self, name): self.name = name def hi(self): print self.name @staticmethod def add(a, b): print a + b if __name__ == '__main__': foo01 = Foo('letian') foo01.hi() foo01.add(1,2) Foo.add(1, 2)
運行結果以下:
letian 3 3
注意,不少編程語言不容許實例調用靜態方法。
3、類方法
類方法是將類自己做爲對象進行操做的方法。類方法使用@classmethod裝飾器定義,其第一個參數是類,約定寫爲cls。類對象和實例均可以調用類方法:
複製代碼代碼以下:
class Foo: name = 'letian ' @classmethod def hi(cls, x): print cls.name * x if __name__ == '__main__': foo01 = Foo() foo01.hi(2) Foo.hi(3)
運行結果以下:
letian letian letian letian letian
注意,不少其餘的編程語言不容許實例調用類方法。
4、super
super用來執行父類中的函數,例如:
class Foo(object): def hi(self): print 'hi,Foo' class Foo2(Foo): def hi(self): super(Foo2, self).hi() if __name__ == '__main__': foo2 = Foo2() foo2.hi()
運行結果:
hi,Foo
注意,Foo類必須繼承某個類(而且這個繼承鏈開始於object類),不然會報錯。若是改爲下面的形式:
class Foo: def hi(self): print 'hi,Foo' class Foo2(Foo): def hi(self): super(Foo2, self).hi() if __name__ == '__main__': foo2 = Foo2() foo2.hi()
運行時報錯以下:
...... TypeError: must be type, not classobj
關於super,具體請見http://docs.python.org/2/library/functions.html?highlight=super#super以及super.doc。
5、類變量和實例變量
類變量定義在類的定義以後,實例變量則是覺得self.開頭。例如:
class Foo(object): val = 0 def __init__(self): self.val = 1 if __name__ == '__main__': foo = Foo() print foo.val print Foo.val
運行結果爲:
1 0
實例也可以訪問類變量,以下:
class Foo(object): val = 0 def __init__(self): pass if __name__ == '__main__': foo = Foo() print foo.val print Foo.val
運行結果以下:
0 0
另外,能夠經過如下方式訪問類變量:
class Foo(object): val = 3 def __init__(self): print self.__class__.val if __name__ == '__main__': foo = Foo()
運行結果:
3
還能夠這樣:
class Foo(object): val = 3 def __init__(self): pass @classmethod def echo(cls): print cls.val if __name__ == '__main__': Foo.echo()
運行結果:
3
6、如何調用父類的構造函數
子類(派生類)並不會自動調用父類(基類)的init方法,例如:
class Foo(object): def __init__(self): self.val = 1 class Foo2(Foo): def __init__(self): print self.val if __name__ == '__main__': foo2 = Foo2()
運行時報錯。
調用父類的init方法有兩種,第一種:
class Foo(object): def __init__(self): self.val = 1 class Foo2(Foo): def __init__(self): Foo.__init__(self) print self.val if __name__ == '__main__': foo2 = Foo2()
第二種:
class Foo(object): def __init__(self): self.val = 1 class Foo2(Foo): def __init__(self): super(Foo2,self).__init__() print self.val if __name__ == '__main__': foo2 = Foo2()
這兩種方法的運行結果均爲:
1
不過這兩種方法是有區別的。