源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-24 10:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:python中的实例方法、静态方法、类方法、类变量和实例变量浅析
注:使用的是Python2.7。 [b]一、实例方法[/b] 实例方法就是类的实例能够使用的方法。如下:
[u]复制代码[/u] 代码如下:
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)
运行结果为:
[u]复制代码[/u] 代码如下:
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内容:
[u]复制代码[/u] 代码如下:
>>> 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.)
[b]二、静态方法[/b] 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法:
[u]复制代码[/u] 代码如下:
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)
    运行结果如下:
[u]复制代码[/u] 代码如下:
letian 3 3
注意,很多编程语言不允许实例调用静态方法。 [b]三、类方法[/b] 类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法:
[u]复制代码[/u] 代码如下:
class Foo:     name = 'letian '     @classmethod     def hi(cls, x):         print cls.name * x if __name__ == '__main__':     foo01 = Foo()     foo01.hi(2)     Foo.hi(3)
运行结果如下:
[u]复制代码[/u] 代码如下:
letian letian letian letian letian
注意,很多其他的编程语言不允许实例调用类方法。 [b]四、super[/b] super用来执行父类中的函数,例如:
[u]复制代码[/u] 代码如下:
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()
运行结果:
[u]复制代码[/u] 代码如下:
hi,Foo
注意,Foo类必须继承某个类(并且这个继承链开始于object类),否则会报错。如果改成下面的形式:
[u]复制代码[/u] 代码如下:
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()
运行时报错如下:
[u]复制代码[/u] 代码如下:
...... TypeError: must be type, not classobj
关于super,具体请见http://docs.python.org/2/library/functions.html?highlight=super#super以及super.doc。 [b]五、类变量和实例变量[/b] 类变量定义在类的定义之后,实例变量则是以为self.开头。例如:
[u]复制代码[/u] 代码如下:
class Foo(object):     val = 0     def __init__(self):         self.val = 1 if __name__ == '__main__':     foo = Foo()     print foo.val     print Foo.val
运行结果为:
[u]复制代码[/u] 代码如下:
1 0
实例也能够访问类变量,如下:
[u]复制代码[/u] 代码如下:
class Foo(object):     val = 0     def __init__(self):         pass if __name__ == '__main__':     foo = Foo()     print foo.val     print Foo.val
运行结果如下:
[u]复制代码[/u] 代码如下:
0 0
另外,可以通过以下方式访问类变量:
[u]复制代码[/u] 代码如下:
class Foo(object):     val = 3     def __init__(self):         print self.__class__.val if __name__ == '__main__':     foo = Foo()
运行结果:
[u]复制代码[/u] 代码如下:
3
还可以这样:
[u]复制代码[/u] 代码如下:
class Foo(object):     val = 3     def __init__(self):         pass     @classmethod     def echo(cls):         print cls.val if __name__ == '__main__':     Foo.echo()
运行结果:
[u]复制代码[/u] 代码如下:
3
[b]六、如何调用父类的构造函数[/b] 子类(派生类)并不会自动调用父类(基类)的init方法,例如:
[u]复制代码[/u] 代码如下:
class Foo(object):     def __init__(self):         self.val = 1 class Foo2(Foo):     def __init__(self):         print self.val if __name__ == '__main__':     foo2 = Foo2()
运行时报错。 调用父类的init方法有两种,第一种:
[u]复制代码[/u] 代码如下:
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()
第二种:
[u]复制代码[/u] 代码如下:
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()
这两种方法的运行结果均为:
[u]复制代码[/u] 代码如下:
1
不过这两种方法是有区别的。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部