python中的實例方法、靜態方法、類方法、類變量和實例變量淺析

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

不過這兩種方法是有區別的。

相關文章
相關標籤/搜索