一、实例方法:
实例方法就是类的实例能够使用的方法。如下:
-
#!/usr/bin/python
-
class test:
-
def __init__(self,name):
-
self.name = name
-
def hi(self):
-
print self.name
-
if __name__ == '__main__':
-
test01 = test('xiaoA')
-
test01.hi()
-
print type(test)
-
print type(test01)
-
print id(test)
-
print id(test01)
-
[root@server1 python]# ./test.py
-
xiaoA
-
<type 'classobj'>
-
<type 'instance'>
-
140325207062192
-
140325207122504
可以看到,test的type为classobj(类对象,python中定义的类本身也是对象),test01的type为instance(实例)。而hi()是实例方法,所以test01.hi()会输出“xiaoA”。实例方法的第一个参数默认为self,代指实例。
self不是关键字,而是约定的写法。__init__()是生成实例时默认调用的实例方法。修改self后,代码如下:
-
class test:
-
def __init__(this,name):
-
this.name = name
-
def hi(here):
-
print here.name
-
t = test('xiaoA')
-
t.hi()
执行结果一样的。
二、静态方法
静态方法是一种普通的函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法:
-
#!/usr/bin/python
-
class test:
-
def __init__(self,name):
-
self.name = name
-
def hi(self):
-
print self.name
-
@staticmethod
-
def add(a,b):
-
print a + b
-
if __name__ == '__main__':
-
test01 = test('xiaoA')
-
test01.hi()
-
test01.add(1,2)
-
test01.add(2,1)
-
[root@server1 python]# ./test.py
-
xiaoA
-
3
-
3
注意:很多编程语言不允许实例调用静态方法。
三、类方法
类方法是将类本身作为对象操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法:
-
#!/usr/bin/python
-
class test1:
-
name = 'xiaoA '
-
@classmethod
-
def username(cls,x):
-
print cls.name * x
-
if __name__ == '__main__':
-
test01 = test1()
-
test01.username(2)
-
test1.username(3)
-
[root@server1 python]# ./test1.py
-
xiaoA xiaoA
-
xiaoA xiaoA xiaoA
四、super
super用来执行父类中的函数,例如:
-
#!/usr/bin/python
-
class test(object):
-
def hi(self):
-
print 'hi,xiaoA'
-
class test01(test):
-
def hi01(self):
-
super(test01,self).hi()
-
-
if __name__ == '__main__':
-
t = test01()
-
t.hi01()
-
[root@server1 python]# ./test.py
-
hi,xiaoA
注意:test类的写法,这个类继承object类。在python2.x上,不继承object类的称之为经典类,继承了object类的称之为新式类
五、类变量和实例变量
类变量定义在类的定义之后,实例变量则是以为self. 开头。例如:
-
#!/usr/bin/python
-
class test(object):
-
val = 0
-
def __init__(self):
-
self.val = 1
-
-
if __name__ == '__main__':
-
t = test()
-
print t.val
-
print test.val
-
[root@server1 python]# ./test.py
-
1
-
0
注意:类变量是通过类名调用,实例变量是通过实例调用,但是实例也可以访问类变量
-
#!/usr/bin/python
-
class test(object):
-
val = 1
-
-
if __name__ == '__main__':
-
t = test()
-
print t.val
-
print test.val
-
[root@server1 python]# ./test.py
-
1
-
1
还可以通过一下方式访问变量:
-
#!/usr/bin/python
-
class test(object):
-
val = 1
-
def __init__(self):
-
print self.__class__.val
-
if __name__ == '__main__':
-
t = test()
-
[root@server1 python]# ./test.py
-
1
六、如何调用父类的构造函数
子类并不会调用父类的init方法,例如:
-
#!/usr/bin/python
-
class test(object):
-
def __init__(self):
-
self.val = 1
-
class test01(test):
-
def __init__(self):
-
print self.val
-
-
if __name__ == '__main__':
-
t =test01()
-
[root@server1 python]# ./test.py
-
Traceback (most recent call last):
-
File "./test.py", line 10, in <module>
-
t =test01()
-
File "./test.py", line 7, in __init__
-
print self.val
-
AttributeError: 'test01' object has no attribute 'val'
运行直接报错。
调用父类构造函数init有两种方法:
第一种
-
#!/usr/bin/python
-
class test(object):
-
def __init__(self):
-
self.val = 1
-
class test01(test):
-
def __init__(self):
-
test.__init__(self) # 直接调用父类__init__(self)构造函数
-
print self.val
-
-
if __name__ == '__main__':
-
t =test01()
-
[root@server1 python]# ./test.py
-
1
第二种
-
#!/usr/bin/python
-
class test(object):
-
def __init__(self):
-
self.val = 1
-
class test01(test):
-
def __init__(self):
-
super(test01,self).__init__()
-
print self.val
-
-
if __name__ == '__main__':
-
t =test01()
-
[root@server1 python]# ./test.py
-
1
建议使用super函数来调用父类的方法。
阅读(1659) | 评论(0) | 转发(0) |