python——实例方法、静态方法、类方法、类变量和实例变量浅析

概述:

  1. 实例方法就是类的实例能够使用的方法。
  2. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可调用静态方法。
  3. 类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法。
  4. super用来执行父类中的函数。
  5. 类变量定义在类的定义之后,实例变量则是以为self.开头。
  6. 如何调用父类的构造函数:子类(派生类)并不会自动调用父类(基类)的init方法。

一、实例方法

实例方法就是类的实例能够使用的方法。如下:

复制代码代码如下:

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的定义改为以下形式:
[code]class Foo:
    def __init__(this, name):
        this.name = name
    def hi(here):
        print here.name

运行依然正确。 内置函数id用来查看对象的标识符,下面是其doc内容:

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

二、静态方法

静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法:

复制代码代码如下:

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

注意,很多编程语言不允许实例调用静态方法。

三、类方法

类方法是将类本身作为对象进行操作的方法。类方法使用@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

注意,很多其他的编程语言不允许实例调用类方法。

四、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。

五、类变量和实例变量

类变量定义在类的定义之后,实例变量则是以为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

六、如何调用父类的构造函数

子类(派生类)并不会自动调用父类(基类)的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

不过这两种方法是有区别的。

时间: 2024-12-23 00:04:46

python——实例方法、静态方法、类方法、类变量和实例变量浅析的相关文章

python中的实例方法、静态方法、类方法、类变量和实例变量

http://www.jb51.net/article/49402.htm 注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: 复制代码 代码如下: class Foo:    def __init__(self, name):        self.name = name    def hi(self):        print self.name if __name__ == '__main__':    foo01 = Foo('letian')

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()"的方式实例化一个对象. 可以通过"类名.类属性"的方式来访问一个类属性. 如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化.实例化,即实例化对象是类对象实例化之后的产物. class Person:# 声明一个类对象 pass p1 = Person()

Java中的类变量、实例变量、类方法、实例方法的区别

类变量:形如static int a; 顾名思义,类变量可以理解为类的变量,类变量在类加载的时候就已经给它分配了内存空间,不同于实例变量(int a; ),实例变量是在该类创建对象的时候分配内存的.并且,每创建一个对象,就会为该实例变量分配相应的内存空间,而类变量它不属于任何一个对象,它为所有对象所共享,所有对象的类变量占用相同的一处内存空间.调用类变量过程中,可以用 类名.类变量 也可以 对象名.类变量 来调用.类变量同于C/C++中接触的static变量,有记忆功能. 类方法:static 

【类不类二】Python的类变量与实例变量

在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理解,就拿来与诸君共享! C博客的大伽: http://blog.csdn.net/xxkkff/article/details/4396895 上一篇[类不类2]: http://www.cnblogs.com/Ruby517/p/5709558.html 一般的类定义是写成这种形式 class <

Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ public static class_variable = "123" } Python3 定义方式 class Test: class_variable = "123" 私有变量定义 Java 的定义方式 class Test{ private static class

Python 类变量与实例变量的区别和用途

假设有一个类Eg: class Eg: n = 'abcd' def __init__(self,name): self.name = name 两个实例a和b: a = Eg('a') b = Eg('b') 那么name就是实例变量,n就是类变量.在生成实例的过程中,类变量存储在类的内存位置中,而实例变量存储在实例内存位置中. 此时,打印两个实例的n值,实例会从类的内存位置去取值,所以值都为abcd: print(a.n , b.n) >>abcd abcd 当在a的实例中修改n的赋值时,

类变量、实例变量--python

1.类变量.实例变量概念 类变量:类变量就是定义在类中,但是在函数体之外的变量.通常不使用self.变量名赋值的变量.类变量通常不作为类的实例变量的,类变量对于所有实例化的对象中是公用的. 实例变量:实例变量是定义在方法中的变量,使用self绑定到实例上的变量,只是对当前实例起作用. 2.访问 类变量在类的内部和外部类变量都可以直接使用className.类变量的形式访问.但是在类的内部,也可以使用self.类变量来访问,但是这个是用含义就不同了(后面使用代码验证). 实例变量在类的内部,实例变

怎么区分类变量和实例变量?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #怎么区分类变量和实例变量? #实例变量:在变量前面添加了self,就是实例变量,比如:self.name(完整定义为:属于实例私有,对实例变量的操作不会影响到其他的实例对象) #类变量:不添加前缀self,就是类变量(完整定义为:被该类的所有实例可以共享的变量,如果某个实例修改了该变量,这个变量可以被其他实例看到) class Person() : count = 0 def __init__(self,

类变量和实例变量的区别

1.简介:       1.类变量也叫静态变量,也就是在变量前加了static 的变量:       2.实例变量也叫对象变量,即没加static 的变量: 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象: 例: 1 public class A{ 2 static int a = 0; //类变量 3 private int b = 0; //实力变量 4 } 5