Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171624
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-13 17:05
文章分类

全部博文(31)

文章存档

2016年(11)

2015年(20)

我的朋友

分类: LINUX

2016-01-13 13:31:50

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

  1. #!/usr/bin/python
  2. class test:
  3.     def __init__(self,name):
  4.     self.name = name
  5.     def hi(self):
  6.     print self.name
  7. if __name__ == '__main__':
  8.     test01 = test('xiaoA')
  9.     test01.hi()
  10.     print type(test)
  11.     print type(test01)
  12.     print id(test)
  13.     print id(test01)
  14. [root@server1 python]# ./test.py
  15. xiaoA
  16. <type 'classobj'>
  17. <type 'instance'>
  18. 140325207062192
  19. 140325207122504
可以看到,test的type为classobj(类对象,python中定义的类本身也是对象),test01的type为instance(实例)。而hi()是实例方法,所以test01.hi()会输出“xiaoA”。实例方法的第一个参数默认为self,代指实例。
self不是关键字,而是约定的写法。__init__()是生成实例时默认调用的实例方法。修改self后,代码如下:

  1. class test:
  2.     def __init__(this,name):
  3.         this.name = name
  4.     def hi(here):
  5.         print here.name
  6. t = test('xiaoA')
  7. t.hi()
执行结果一样的。

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

  1. #!/usr/bin/python
  2. class test:
  3.     def __init__(self,name):
  4.     self.name = name
  5.     def hi(self):
  6.     print self.name
  7.     @staticmethod
  8.     def add(a,b):
  9.     print a + b
  10. if __name__ == '__main__':
  11.     test01 = test('xiaoA')
  12.     test01.hi()
  13.     test01.add(1,2)
  14.     test01.add(2,1)
  15. [root@server1 python]# ./test.py
  16. xiaoA
  17. 3
  18. 3
注意:很多编程语言不允许实例调用静态方法。

三、类方法

类方法是将类本身作为对象操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法:

  1. #!/usr/bin/python
  2. class test1:
  3.     name = 'xiaoA '
  4.     @classmethod
  5.     def username(cls,x):
  6.     print cls.name * x
  7. if __name__ == '__main__':
  8.     test01 = test1()
  9.     test01.username(2)
  10.     test1.username(3)
  11. [root@server1 python]# ./test1.py
  12. xiaoA xiaoA
  13. xiaoA xiaoA xiaoA
四、super
super用来执行父类中的函数,例如:

  1. #!/usr/bin/python
  2. class test(object):
  3.     def hi(self):
  4.     print 'hi,xiaoA'
  5. class test01(test):
  6.     def hi01(self):
  7.     super(test01,self).hi()

  8. if __name__ == '__main__':
  9.     t = test01()
  10.     t.hi01()
  11. [root@server1 python]# ./test.py
  12. hi,xiaoA
注意:test类的写法,这个类继承object类。在python2.x上,不继承object类的称之为经典类,继承了object类的称之为新式类

五、类变量和实例变量
类变量定义在类的定义之后,实例变量则是以为self. 开头。例如:

  1. #!/usr/bin/python
  2. class test(object):
  3.     val = 0
  4.     def __init__(self):
  5.     self.val = 1

  6. if __name__ == '__main__':
  7.     t = test()
  8.     print t.val
  9.     print test.val
  10. [root@server1 python]# ./test.py
  11. 1
  12. 0
注意:类变量是通过类名调用,实例变量是通过实例调用,但是实例也可以访问类变量

  1. #!/usr/bin/python
  2. class test(object):
  3.     val = 1

  4. if __name__ == '__main__':
  5.     t = test()
  6.     print t.val
  7.     print test.val
  8. [root@server1 python]# ./test.py
  9. 1
  10. 1
还可以通过一下方式访问变量:

  1. #!/usr/bin/python
  2. class test(object):
  3.     val = 1
  4.     def __init__(self):
  5.     print self.__class__.val
  6. if __name__ == '__main__':
  7.     t = test()
  8. [root@server1 python]# ./test.py
  9. 1
六、如何调用父类的构造函数

子类并不会调用父类的init方法,例如:

  1. #!/usr/bin/python
  2. class test(object):
  3.     def __init__(self):
  4.     self.val = 1
  5. class test01(test):
  6.     def __init__(self):
  7.     print self.val

  8. if __name__ == '__main__':
  9.     t =test01()
  10. [root@server1 python]# ./test.py
  11. Traceback (most recent call last):
  12.   File "./test.py", line 10, in <module>
  13.     t =test01()
  14.   File "./test.py", line 7, in __init__
  15.     print self.val
  16. AttributeError: 'test01' object has no attribute 'val'
运行直接报错。
调用父类构造函数init有两种方法:
第一种

  1. #!/usr/bin/python
  2. class test(object):
  3.     def __init__(self):
  4.     self.val = 1
  5. class test01(test):
  6.     def __init__(self):
  7.         test.__init__(self)  # 直接调用父类__init__(self)构造函数
  8.     print self.val

  9. if __name__ == '__main__':
  10.     t =test01()
  11. [root@server1 python]# ./test.py
  12. 1
第二种

  1. #!/usr/bin/python
  2. class test(object):
  3.     def __init__(self):
  4.     self.val = 1
  5. class test01(test):
  6.     def __init__(self):
  7.     super(test01,self).__init__()
  8.     print self.val

  9. if __name__ == '__main__':
  10.     t =test01()
  11. [root@server1 python]# ./test.py
  12. 1
建议使用super函数来调用父类的方法。
阅读(1665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~